补码(由计算机中的减法运算引入)
-
原码是人为表示的,一个数的二进制直观表示
-
机器中识别的机器码为补码(补之意,即只有正没有负)机器无法自动识别符号位,不区分正负数,一概视为正数
-
既然机器无法识别负数,那么要计算一个减法运算时,减去一个数要表示为加上一个负数,负数该如何表示----用补码。负数转换为正数,引入了模的概念。8bit长度的二进制数最大表示的数为1111 1111 十进制为255,模为256,因为其表示的数不能超过256(<256)。负数加上模即为这个数的补。
-
8bit长度的二进制数如何加上模得到补,不可能是 x + 1 0000 0000 这种运算。于是引入一个循环的概念,反码(反)。(绝对值)|自己|+自己的反 = 最大数,最大数+1=模,自己+模=补。自己转换到补,推导为:自己反+1=补。对于有正负观念的人来说,以8为模,-2的补等于-2+8=6。最大能表示的数为7,-2的反为5,5+1=6。在公式中,自己+自己的反=最大数,此时自己应视为无符号的数,即一个正数,101无符号表示为5,101有符号表示为-1,其反为010,表示为2,即5+2=7,才能表示为最大的7。在公式中,自己+模,这里的自己是有符号的,这样一来,前后的自己就消去了,故自己反+1=补。因此自己+模=自己反+1=补。
举个例子:例如求-2的补码,假设模是8,那么最大能表示的数就是7,-2的反是5。如何得到这个5?假设一个时钟,一共能指向0~7这8个数,0点又可以称为7点(就像日常的钟表12点可以称为0点一样),从0点逆时针转2个,即-2,和从7点逆时针转2个,即5是一样的,也可以理解成为0点顺时针转5个。所以-2的反是5。这样|-2|+5=7,7就是能表示的最大数。最大数+1,即7+1=8,就得到了模。我们现在求-2的补,那么它自己是-2,-2+模=-2+8=6,补就是6。把整个公式写下来就是:|-2|+5+1+(-2)=6。约分后就是5+1=6,即反+1=补。 -
当使用补码参与运算时,计算机就全当作无符号整型来计算,溢出的部分不计。
8bit有符号整数的模是128,占7bit。表示范围为-128~127(-128=1000 000, 127=0111 1111)。使用了最高位作为符号位(人所理解的)。有符号整数对于机器而言,仍旧是无符号整数,是0000 0000 ~ 1111 1111 (0~255),128=1000 0000对应的是-128,255=1111 1111对应的是-1,在计算机中,GCC中,将机器码翻译成为了负数。
如图所示,1000 0000 表示的8位无符号数为128,同时8位无符号数的模是256(最大表示到255),自己+模=补,从无符号数的角度来看,补=128,模=256,自己=补-模,即自己=128-256=-128,由此得来,一个有符号二进制数补码为1000 0000对应的真值为-128。
同理,求补码1000 0001表示的有符号数是多少: 8位无符号数的模是256,1000 0001 表示的无符号数是129,自己+模=补,自己=补-模,即129-256=-127,符合。或者把补码1000 0001转回原码,取反加1,1111 1111,最高位是符号位,其余111 1111表示127,即-127。
从补码的角度来理解计算机,可能会对我们理解原码、反码、补码,这几个码更有深入的理解。