计算机为什么采用补码来进行运算
基础知识了解:
在计算机内,整数的长度是确定的,在字长为32位的计算机中,整数的长度就是32个二进制,这其中还包括了符号位(1表示正,0表示负)。这里面我们为了方便描述,就假设机器字长为8位。
例如,十进制整数23,二进制真值表示为10111,其原码表示为 0001 0111。
十进制整数-23,二进制真值表示为-10111,原码表示为 1001 0111。
简而言之,源码就是最高位为符号位,其他位表示该数的绝对值
如果计算机内部采用原码表示数,那么在进行加法和减法运算的时候,最终都转化为两个绝对值的加运算和减运算,因此,在设计计算器的时候就既需要设计加法运算器,又要设计减法运算器(代价有点大,是否可以就用一种类型的运算器呢? 其实大多数人都喜欢做加法运算,不太喜欢用减法运算)。
补码的思想
我们希望只设计加法运算器,不用减法运算器,我们希望找到一种方案,采用这种方案做加运算 1 + ( -1 ) ,两个数可以直接根据二进制的加法规则做运算,得到0,而不必做减法。
补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。
以-8作为例子。假定有两种表示方法。一种是直觉表示法,即10001000;另一种是2的补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?
随便写一个计算式,16 + (-8) = ?
16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:
+10001000
---------
10011000
现在,再来看2的补码表示法。
+11111000
---------
100001000
补码的本质:
要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。
已知8的二进制是00001000,-8就可以用下面的式子求出:
00000000
- 00001000
---------
因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。
所以,0000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成:
100000000
-00001000
---------
11111000
进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:
11111111
-00001000
---------
11110111
+00000001
---------
11111000
补码的两个转换步骤就是这么来的。(其中的 1111 1000 就是-8的补码,是由对 000 1000 取反得到111 0111 加1 最终得到 111 1000,最后加上符号位1就是1111 1000)。这就是补码计算规则的由来。