首先明确两点
1.正数或者说无符号数的原码、反码、补码都是一样的
2.计算机对数值的存储中,对于负数,是以补码的形式进行存储的
ok,接下来在好好研究下原码、反码、补码以及有符号、无符号。
而且,下面的只是针对有符号数!
有符号数的反码就是其绝对值的原码数值位取反,比如 -1;
-1首先取绝对值为1,二进制表示为 0000 0001;而因为是负数,所以符号位变为1;
ok,接下来,数值位取反,则变成了 1111 1110;那么,这个表示形式就是-1的反码。
那么,补码呢?补码就是在反码的基础上加1,即1111 1111。因此,char a=-1这个值
在内存中的二进制形式就是 1111 1111。用例子说明:
可以看到,打印出来的十六进制的数值是ff,这就说明了有符号中的负数在计算机中是以补码形式存在的。
那么,为什么会有补码这种存在的形式呢?
1.为了编码统一。
如果只有原码和反码,那么0就会有两种存在方式。分别为 0000 0000 和 1000 0000 ,这明显会造成混乱的;
而有了补码,这两个值有分别代表了0和-128,这样保证了唯一性。
2.便于加法运算。
所为补码,即为互补。可以想象一个时钟现在是12点,如果你想走到1点,那么你既可以前进1,也可以后退11,这样会方便。
而计算机中的补码存在大抵也有此类的考虑。
当然还有其它的优点,这里不详细的去考证了。