计算机为什么要用补码?

转载自:http://blog.csdn.net/bendanban/article/details/8681456

计算机使用补码表示负整数!正整数就用源码来表示。那什么是补码呢?其实源码的补码就是源码的相反数,他们相加得0 。

计算负整数的补码:

规则就是源码各位取反,然后加1得到。

例如:如果我们用8位来表示有符号整数的话,那么十进制1用二进制表示为:

[cpp]  view plain  copy
  1. 00000001  
这个数取反加1的结果是:

[cpp]  view plain  copy
  1. 11111111  

所以,-1的补码就是11111111。

大家可能会有疑问,到底什么是补码,为什么-1的补码不是-1的源码取反加1呢?

这是因为:-1的补码是1的补码表示法。所以计算机里用1的相反数(就是-1的补码)来表示-1 。


计算二进制有符号数的十进制数

既然有符号数在计算机里有补码表示负整数,那我们如何根据给定的二进制数来计算十进制数呢?

看例子:

假设给了一个数:

[cpp]  view plain  copy
  1. 10000100  

看符号位为1,为负数,所以这个数是用补码表示的!先计算源码。

各位取反加1的结果是:

[cpp]  view plain  copy
  1. 01111100(二进制) = 124(十进制)  

所以原先给出的二进制数的十进制数是 -124 。


计算负整数的二进制补码表示

继续刚才那个例子,如果我们拿到的是十进制-124,那么他的二进制补码是多少呢?

其实他的补码就是124的二进制数求补的结果。

124的二进制数为:01111100

取反                       :10000011

加1                         :10000100

所以-124的二进制补码表示就是10000100


为什么使用补码表示负整数

原因很简单,如果使用补码表示负整数,那么ALU在做整数之间的操作时,就不用区分符号了,所有位都会参与运算,其上上面的例子中,符号位都参与了运算。

例如执行2-1这个操作,我们可以用2+(-1)来计算。

2的二进制数是:00000010

1的二进制数是:00000001   -->   -1的二进制补码是:11111111

所以2+(-1):

[cpp]  view plain  copy
  1.   00000010  
  2. + 11111111  
  3. ----------------  
  4.   00000001  

结果是1。

我们再看个结果为负数的。

求1-2的结果,用1+(-2)来计算。

2的二进制数是:00000010,所以-2的二进制数为:11111101+1=11111110

1+(-2)的计算过程是:

[cpp]  view plain  copy
  1.   00000001  
  2. + 11111110  
  3. ---------------  
  4.   11111111  

这个结果的十进制数是多少呢?

首先它是个负数,说明结果使用补码表示的,将各位取反加1后的结果是00000001=1(十进制),然后加上他的符号,就是-1了,

所以1+(-2)的结果是-1 。

用补码计算确实简化了ALU的设计难度!!所以计算机用补码来表示负整数!!!!


你可能感兴趣的:(计算机为什么要用补码?)