一、原码:
所谓原码就是当前数字的二进制表现形式,int为例,第一位表示符号 (0正数 1负数)简单期间一个字节表示
+7的原码为: 00000111
-7的原码为: 10000111
对于原码来说,绝对值相等的正数和负数只有符号位不同。
二、反码:
正数的反码就是本身。负数的反码是二进制保留符号位。剩余位取反,比如-1的反码是1111 1110;
三、补码:
正数的反码、补码、原码都是一样的,负数的补码是在其反码的基础上+1,比如-1的补码是1111 1111。
为什么要使用补码呢:
我们知道,0是不分正数还是负数的,也就是说,如果使用原码表示0的话,有两种表示方式,即00000000与10000000,这对计算来说很不方便。
如果我们使用补码来表示的话:
正数的0的表示:
因为正数的原码、反码、补码都是相同的。所以正数0的反码与补码都是00000000;
负数的0的表示:
负数的0的原码是10000000,它的补码也就是在其反码的基础上+1,10000000的反码为符号位不变,剩余位取反,即为11111111,再加一的话为00000000,这样的话0的正数表示与负数表示都是00000000。
其实还有一个更重要的原因:就是利用高位溢出,将减法运算变成加法运算。这样可以简化运算的设计:
比如计算3-2,我们可以当做3+(-2)来运算:
化为二进制:
3:0000 0011;
-2:原码:1000 0010;反码:1111 1101;补码在反码基础上+1,即为:1111 1110
这样3+(-2)的计算为:1000 0010
+ 1111 1110
--------------------
高位溢出结果为:0000 0001
在计算机系统中,数值都是以补码来表示和存储的。计算机计算过程是 先转换成补码,再按位相加。