1.3.3 二进制补码的减法运算
1.补码的减法运算
二进制补码的加减运算
我们先利用生活中常见的指针式钟表解释补码运算的原理。如果你在5点钟时发现时针停在10点,需要将其调整到5点,有两种调整方法:一是将时针朝逆时针方向拨5格,调整到5点,即10 - 5 = 5; 二是将时针朝顺时针方向拨7格,调整到5点,即10 + 7 = 17,由于钟表盘的最大数为12,将超过12的“进位”丢掉后,剩下的余数即为需要的结果,即17 - 12 = 5。
由此说明10 - 5可以用10 + 7完成(舍去进位)。由于钟表盘共有12个数,因此称12为进位的模,而5为-7对模12的补码,同样,7为-5对模12的补码。同理,4为-8对模12的补码,8为-4对模12的补码。
这里引入了“模”的概念,用M表示(也写作mod M)。所谓“模”是指一个计数系统的进位基数。例如,钟表的小时从1到12有12个数,它的模是12;1位十进制数为0~9,其模M=10,n位十进制数的模M=10n;n位二进制数的模M=2n。
从上述例子中可以得出一个结论:减去某个数可以用加上它的负数的补码来完成,并舍去进位。这个结论同样适用于二进制数的运算。
计算机等数字系统均采用补码进行有符号二进制数的减法运算。
设A和B均为n位正数,则补码的运算规则如下:
(A + B)补= (A)补+ (B)补
(A - B)补= (A)补+ ( -B)补
(-A + B)补= (-A)补+ (B)补
(-A - B)补= (-A)补+ (-B)补
进行二进制补码运算时,必须注意以下几点。
(1)参与运算的是补码,运算结果仍是补码。
(2)被加数与加数的补码采用相同的位数,如果运算结果超过了模,产生了进位,则丢弃进位才能得到正确结果。
(3)符号位与数值位一起参与运算,结果的符号位由运算结果确定。
例1.3.7 试用8位二进制补码计算13 - 15。
解 (13 - 15)补= (13)补+ (-15)补= 00001101 + 11110001= 11111110
在补码系统中,符号位和数值位按同样的规则参加运算,例1.3.7的运算过程如下:从最右边开始,依次将被加数和加数的对应位相加,得到结果的补码为11111110。其符号位为1,说明是负数,其对应的十进制数真实值为-2,结果正确。
2.溢出
例1.3.8 试用4位二进制补码完成下列运算。
(1)4 + 3 (2)-5 - 3 (3)2 + 6 (4)-3 - 6。
解 下面是具体的运算过程,同时还给出了对应十进制数的运算。仔细分析每一个题目的两种运算结果,发现(1)和(2)的结果正确,而(3)和(4)的补码运算结果是错误的。错误产生的原因在于4位二进制补码中有3位是数值位,所表示的范围为-8~+7。而(3)和(4)的运算结果应分别是+8和-9,均超过了该表示范围,因而产生了溢出。比较4种情况可知,两个符号相反的数相加不会产生溢出,但两个符号相同的数相加有可能产生溢出。如果两个符号相同的数相加时,和的符号与它们的符号不同,则说明运算结果溢出了。