阅读:0       作者:严长生

二进制数的加法和减法:有符号二进制数的加减法

本节我们将讨论有符号二进制数的基本算术运算,也即加法和减法。

如果使用原码表示两个数,那么在做减法运算时,首先要比较两个数的绝对值,然后以绝对值大的一个作为被减数,绝对值小的一个作为减数,求出差值,并以绝对值大的一个符号作为差值的符号。不难看出,这个操作过程比较麻烦,而且要使用数字比较电路和减法运算电路。

如果使用补码表示两个数,那么就可以使用两个数的补码相加来代替上述的减法运算,从而省去比较电路和减法电路,简化运算器的电路结构。

所以,为了简化硬件设计,数字电路基本都采用补码的形式来表示数字。

有符号二进制数的加法

以有符号二进制数 A 和 B 为例,将它们写成补码形式后,就可以像无符号数一样对它们直接进行相加。不过注意,如果符号位产生了进位,必须直接舍弃(忽略)才能得到正确的值。

如果结果的符号位是 0,那么表明是正数,直接取得数字大小即可(正数的补码和原码相同);如果符号位是 1,那么表明是负数,必须先把补码转换为原码才能得到正确的值。

例子1

让我们使用补码来计算两个十进制数字 +7 和 +4 的和。|+7| + |+4| = 11,使用四个二进制位才能表示,这是数值位;此外还有一个符号位,所以共需要五个二进制位。
| | 表示求绝对值。
+7 和 +4 的补码分别是:

(+7)10 = (00111)2
(+4)10 = (00100)2

将两个数相加:

(+7)10 + (+4)10 = (00111)2 + (00100)2
⇒(+7)10 + (+4)10 = (01011)2

结果包含了五个二进制位,所以符号位没有产生进位。符号位为 0 表明结果是正数,直接转换成十进制形式即可,结果为 +11。

例子2

让我们使用补码来计算两个十进制数 -7 和 -4 的和。与上同理,|-7| + |-4| = 11,也需要五个二进制位。

-7 和 -4 的补码分别是:

(−7)10 = (11001)2
(−4)10 = (11100)2

将两个数相加:

(−7)10 + (−4)10 = (11001)2 + (11100)2
⇒(−7)10 + (−4)10 = (110101)2

结果包含了六个二进制位,最高位的 1 是符号位相加产生的进位,是多出的一个二进制位,所以直接丢弃。丢弃进位以后的结果是:

(−7)10 + (−4)10 = (10101)2

符号位为 1 表明结果是负数,必须先转换为原码才能得到数字的大小。转换为原码后的结果是:

(−7)10 + (−4)10 = (11011)2

所以,-7 加 -4 的结果是 -11。

有符号二进制数的减法

以有符号二进制数 A 和 B 为例,我们知道,减去一个数等于加上该数的相反数(符号相反的数称为“相反数”),也即:

A - B = A + (-B)
B - A = B + (-A)

这样就可以使用两个数的加法来代替两个数的减法。如此一来,加法的规则同样适用于减法。

例子3

让我们使用补码来计算 +7 减去 +4 的差。先将它们转换成加法形式:

(+7)10 − (+4)10 = (+7)10 + (−4)10

与上同理,|+7| + |-4| = 11,也需要五个二进制位。

使用补码的形式来计算加法:

(+7)10 = (00111)2
(-4)10 = (11100)2
⇒(+7)10 + (-4)10 = (00111)2 + (11100)2 = (100011)2

结果包含了六个二进制位,最高位的 1 是符号位相加产生的进位,是多出的一个二进制位,所以直接丢弃。丢弃进位以后的结果是:

(+7)10 + (-4)10 = (00011)2

符号位为 0 表明是正数,直接转换成十进制形式即可,结果为 +3。

例子4

让我们使用补码来计算 +4 减去 +7 的差。先将它们转换成加法形式:

(+4)10 − (+7)10 = (+4)10 + (−7)10

与上同理,|+4| + |-7| = 11,也需要五个二进制位。

使用补码的形式来计算加法:

(+4)10 = (00100)2
(-7)10 = (11001)2
⇒(+4)10 + (-7)10 = (00100)2 + (11001)2 = (11101)2

结果包含了五个二进制位,所以符号位没有产生进位。符号位为 1 表明结果是负数,必须先转换为原码才能得到数字的大小。转换为原码后的结果是:

(+4)10 + (-7)10 = (10011)2

所以,+4 减去 +7 的结果为 -3。