为了简化计算机硬件电路的设计。
1、由于整数加减运算是计算机内部最基本的运算,同时减法运算又等价于加法运算(a-b 等价于 a+(-b)),因此只保留加法运算。
2、无符号整数的加法运算很简单,加就行了,溢出就溢出了,没什么多说的,电路也很简单。
3、对于有符号整数的加法运算来说,在做加法时还要判断数据的正负,这会使电路复杂,因此能否想到一种更简单高效的计算方法来完成有符号整数的加法运算?
答案是,有。
具体思路是,(1)先将有符号整数“转为”无符号整数,(2)进行加法运算,(3)再将无符号整数的结果“转回”有符号整数,即可。
具体在于,如何“转为”和“转回”?
对于有符号正整数来说,这很简单,不用变就是了。
但对于有符号负整数来说,简单的不用变就有问题了。比如+(-1) (有符号整数,原码10000001),我们要是也不变,认为是+129 (无符号整数,原码10000001),那结果肯定是有问题的。大家按照刚才说过的计算思路随便找例子试就能看到问题在哪里。
为了解决这个问题,我们发现,对于一个8位整数来说,+(-1)和+255才是等价的(考虑溢出),为什么等价,是因为-1与255对数据最大容量256是同余的。
因此我们需要找到一种方法,使有符号数-1(原码10000001)能被当成无符号数255(原码11111111)来进行加法运算的方法。
方法就是(还以8位整数来举例子):
(1)保留符号位,然后其余各位取反。(取反的本质:其实相当于在原数(除去符号的部分)基础上加了一个1111111(7位,127))
(2)步骤(1)的结果再加1(总体相当于在原数(除去符号的部分)的基础上加了10000000(8位,128))
因为是负数,还有一个符号在首位,因此整体上相当于在原数(整体)的基础上加了10000000又加了10000000,即256。因此与原数对于数据最大容量256同余。即有符号负整数“转化”为无符号整数的方法找到了。转回的原理同理,方法就是逆操作一遍,就不赘述了。
总结一下,“转为”和“转回”的原理都是因为,找到对“最大容量” 同余 的那个无符号整数。
回望步骤(1),它叫反码。
回望步骤(2),它叫补码。
使用补码来做加法运算,将使计算机的基础硬件单元“加法器”的设计大大简化,提高了计算机的整体性能。