计算机中为什么要使用补码

我们假设不使用补码在计算机的运算中会发生什么,以一个简单数学算式7-6=1来分析

1,使用原码

7 的二进制原码 :0 000 0111   其中最高一位表示符号位

-6的二进制原码 :1 000 0110

二者做相加运算

  0 000 0111

+1 000 0110

   1 000 1100

这个结果 符号位是1 表示是一个负数。明显结果有误

2,使用反码

7 的二进制反码:0 000 0111

-6的二进制反码   1 111 1001

二者做相加运算

  0 000 0111

+1 111 1001

1 0 000 0000

计算产生了进位,最高位溢出,舍弃。结果就是 0 000 0000.这个结果也是不合理。和十进制的运算结果不一致。

但是我们发现如果在这个结果上再加上1,就是我们想要的结果了。这个问题是不是具有一般性? 再随便举个例子8-5=3

8的原码:0 000 1000 ;8的反码: 0 111 0111

-5的原码   1 000 0101 ;-5的反码:1 111 1010

二者做相加运算:

 0 111 0111

+1 111 1010

1 0 000 0001 


最高溢出位舍弃, 结果是1 。 这个结果之上再加上1就是我们想要的结果。

3, 补码

从上面的分析我们可以看出,反码运算总是比我们想要的结果少1. 那么我们是不是可以对负数的补码从新做个规定, 就是在原来的取反基础之上再加1. 这样做运算就可以得到我们想要的结果了。

4 ,补码的好处

首先加入没有补码,+0 在计算机中的表示0 000 0000. -0 在计算机中的表示1 000 0000. 并不一致。

如果采用补码-0 的补码就是 0 000 0000. 两者一致

其次我们知道8位二进制的表示形式总共有0000 0000-1111 1111 那么多,恰好是2^8=256.  也就是说理论上可以表示256个十进制数字。我们前面知道,-0 在计算机中如果再用原码 就是1 000 0000 。如果采用反码就是1 111 1111. 会多占用一个表达。

所以如果采用补码就可以把1 000 0000 这个表达空出来表示一个十进制数字。 很显然用它来表示-128 最为合理。

还可以从另外一个角度来理解: -127 的补码是1000 0001.再减去1 就是1000 0000 。那-127-1=-128.

所以补码的好处就是计算机的表达位数可以充分利用表示跟多的十进制数。




你可能感兴趣的:(201803)