标签:
原码,补码,反码,这东西在我刚开始学习java的时候困扰了我好一会,看书本上的说法总感觉缺点什么
究其因归结为一个问题:1000 0101为什么不是-5?
1) 后来查了资料,自己梳理了下,理清楚了,在计算机中,系统统一使用补码来表示和存储,原因在于通过这种规则可以将符号位参与逻辑运算,于是有了以下两条规则
① 正数: 补码 = 反码 = 原码
② 负数: 补码 = 反码 + 1, 反码 = 该负数对应的正数原码最高位取1
2) 下面主要说明负数的补码换算过程,就以-5为例:
① 5的原码0000 0101,最高位取1,得到-5的原码1000 0101
② 最高位不变,其他位取反,得到-5的反码1111 1010
③ 反码 + 1,得到-5的补码1111 1011,所以-5的补码是1111 1011
3) 那前面问题中的1000 0101究竟是什么?我们不妨逆推下
① 1000 0101是一个负数的补码,减1,得到它的反码为1000 0100
② 那它的原码为最高位不变,其余位取反,得到1111 1011
③ 则该负数对应的正数原码为0111 1011,换算成十进制为2^6 + 2^5 + 2^4 + 2^3 + 2^1 + 1 = 123
因此1000 0101为-123,而非-5,只要记住一点,我们所看到的负数并非真正的负数,而是负数的补码形式,要换算成原码才是它真正的值
4) 我们还需要注意几个点
① 0的补码为0000 0000,-128补码为1000 0000(同理还有-2^15等)
② 正数的补码 + 该正数对应负数的补码 = 0000 0000
-5: 1111 1011
5: 0000 0101
两者之和为0000 0000,满足数学运算逻辑
标签:
原文地址:http://www.cnblogs.com/windyrain/p/5751383.html