补码 的运算
补码的算术运算
补码运算要注意的问题:
1.补码运算时,其符号位与数值部分一起参加运算。
2.补码的符号位相加后,如果有进位出现,要把这个进位舍去(自然丢失)。
3.用补码运算,其运算结果亦为补码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求补才是其真值。
[例3] 已知X = + 1101 , Y = + 0110 , 用补码计算Z = X-Y。
解: [X]补 = 01101,[-Y]补 = 11010,则[Z]补 =[X]补+[-Y]补 = 01101+11010
= 100111 , 其真值为Z = + 0111。
[例4] 已知X = + 0110 , Y = + 1101 , 用补码计算Z = X-Y。
解: [X]补 = 00110,[-Y]补 = 10011,则[Z]补 =[X]补+[-Y]补 = 00110 + 10011
= 11001 , 其真值为Z = - 0111。
4 溢出及补码溢出的判断
无论采用何种机器数,只要运算的结果大于数值设备所能表示数的范围,就会产生溢出。 溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。
由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。
[例5] 某数字设备用五位二进制表示数,计算
(1)9+3 (2)-9-3 (3)9+12 (4)-9-12
解:(1)[+9]补+[+3]补= 01001+ 00011 = 01100 = +12 正确;
(2)[-9]补+[-3]补= 10111+ 11101 = 110100 = 10100(符号位进位自然丢失), 其真值为-1100 = -12正确;
(3)[+9]补+[12]补= 01001 + 01100 = 10101 其真值为-1011 =-11错误,产生了溢出;
(4)[-9]补+[-12]补 = 10111+10100 = 101011 其真值为01011= +11 错误,产生了溢出。
(1)、(2)两题结果均正确,查其最高位和次高位的进位位,不是均无进位产生,就是均产生进位;(3)、(4)两题结果均错误,查其最高位和次高位的进位位,只有一位产生了进位。此即为判断机器是正常进位还是溢出的基本依据,在微型机中可用异或电路来实现上述的判断。
负数的减法运算也要设法化为加法来做,其所以使用这种方法而不使用直接减法,是因为它
可以和常规的加法运算使用同一加法器电路,从而简化了计算机的设计。
数用补码表示时,减法运算的公式为
[x-y]补=[x]补-[y]补=[x]补+[-y]补 (2.18)
只要证明[-y]补=-[y]补,上式即得证。现证明如下:
∵ [x+y]补=[x]补+[y]补 (mod 2)
∴ [y]补 =[x+y]补-[x]补 (2.19a)
∵ [x-y]补=[x+(-y)]补=[x]补+[-y]补
∴ [-y]补 =[x-y]补-[x]补 (2.19b)
将式(2.19a)与(2.19b)相加,得
[-y]补+[y]补=[x+y]补+[x-y]补-[x]补-[x]补
=[x+y+x-y]补-[x]补-[x]补
=[x+x]补-[x]补-[x]补=0
故
[-y]补=-[y]补 (mod 2) (2.20)从[y]补求[-y]补的法则是:对[y]补包括符号位“求反且最末位加1”,即可得到
[-y]补。写成运算表达式,则为
[-y]补=﹁[y]补+2-n (2.21)其中符号﹁表示对[y]补作包括符号位在内的求反操作,2-n表示最末位的1
[例10] 已知x1=-0.1110,x2=+0.1101,求:[x1]补,[-x1]补,[x2]补,[-x2]补。
[解:]
[x1]补=1.0010
[-x1]补=﹁[x1]补+2-4=0.1101+0.0001=0.1110
[x2]补=0.1101
[-x2]补=﹁[x2]补+2-4=1.0010+0.0001=1.0011
[例11] x=+0.1101,y=+0.0110,求x-y。
[解:]
[x]补=0.1101
[y]补=0.0110, [-y]补=1.1010
[x]补 0.1101
+[-y]补 1.1010
[x-y]补 10.0111
所以 x-y=+0.0111