指路大佬:二进制的原码、反码、补码 - 知乎 (zhihu.com)
总:在计算机系统中,数据一律用补码表示和存储。主要原因是:使用补码,可以将符号位和数据位统一处理,同时,加法和减法也可以统一处理。除此之外,原码和反码中有+0和-0的存在,补码中只有+0,没有-0。用补码计算简化运算。 补码中不存在-0, 10000000表示-128
补码最重要的意义就是便于计算,加法和减法都可以当作加法来处理。
便于计算首要思想是一对相反数的补码相加是全0。理解这个思想我们方便处理最高位是符号位还是参与数值计算。比如-56+-67=-123,但是-123 结果是10000101,这个最高位是否要参与计算?为什么?理解了相反数的补码相加是0,我们便不会混淆这个问题。
一、第一种解释-负数的补码的求法为什么是反码+1
注意,计算机存储中没有反码,反码的意义就是便于我们计算补码。反码的存在是因为补码的存在。补码的意义并不是反码+1。这只是一种便于我们计算的方式而已。
首先,一对相反数的反码相加是全1【全1为个人便于理解的表述,非书本表述】。
举例:
+8原码:00001000 +8的反码和原码相同
-8原码:10001000
-8反码:11110111
+8和-8的反码相加为
00001000+11110111=11111111 即全1。
因此,两个相反数的补码相加是全0【全1为个人便于理解的表述,非书本表述】。
具体推导:
我们通常所学习的负数的补码的计算为反码+1。
又因为正数的原码、反码和补码相同,负数的补码为反码+1。所以上面的+8和-8的反码相加的结果 再加一 就是结果全0
+8和-8的补码相加为
00001000+11110111=00000000即全0
二、第二种解释
补码的思想来源于时钟。逆时针旋转10小时,和顺时针旋转2小时,最后的指向是一样的。现在指向8h,8+10=8-2=6 指向的数一样。
即,减去一个数,等于加上另一个数,即0-a=0+b 0=a+b。因此不需要考虑数据是否为负数,直接把减法当作加法计算即可。
三、计算举例
1. 0110-0010即6-2=4。
利用加法的思想就是 0110 并不是减去了0010 而是加上了0010的相反数。
补码中,一对相反数的和为0,所以0010的相反数为1110。
即0110-0010= 0110+1110= 0100 【10100舍去高位1】
2. 不知道最高位是否要计算到数值中的情况。
(1)(-56)+(-67)=-123
-56的补码为11001000,-67的补码为10111101,结果为10000101。 这时我们不知道最高位的1是单纯的符号位还是含数值,遇到这种情况,我们可以计算它的相反数。补码的一对相反数的和为0。
所以10000101的相反数为01111011也就是+123.
所以10000101是-123。
(2)-128
-128也是同理,遇到10000000我们不知道是否要计算最高位。那么先计算他的相反数,为10000000,即128。那么10000000这个数为-128。
这个128溢出了,8位补码的表示最大值为+127,没有+128。
-128需要特意记住。也可以这样记忆:在原码和反码中10000000表示-0,在补码中没有-0,所以补码多了一个表示。这个多的10000000用来表示-128。
计算方式再补充
补码的真值可以按照这个公式进行计算:
n从0开始记,1000,这里n是3。
公式计算:1011= 即-5。
-128= =-128