[A-B]
补
=[A]
补
+[-B]
补
=1,0100011+1,1010011=10,1110110
按模2
n+1
的意义,最左边的“1”自然丢掉,故[A-B]
补
=0,1110110,还原成真值得A-B=118,
结果出错,这是因为A-B=-138 超出了机器字长所能表示的范围。在计算机中,这种超出机
器字长的现象,叫溢出。为此,在补码定点加减运算过程中,必须对结果是否溢出作出明确
的判断。
解:由A=-93=-1011101,得[A]
补
=1,0100011
2.溢出判断
补码定点加减运算判断溢出有三种方法。
(1)用一位符号位判断溢出。对于加法,只有在正数加正数和负数加负数两种情况下才
可能出现溢出,符号不同的两个数相加是不会出现溢出的。对于减法,只有在正数减负数或
负数减正数两种情况下才可能出现溢出,符号相同的两个数相减是不会出现溢出的。因此在
判断溢出时可以根据参加运算的两个数据和结果的符号位进行;两个符号位相同的补码相
加,如果和的符号位与加数的符号相反,则表明运算结果溢出;两个符号位相反的补码相减,
如果差的符号位与被减数的符号位相反,则表明运算结果溢出。这种方法需要判断操作是加
法还是减法,以及运算结果与操作数的符号关系。
符号不同的两个数相加不会产生溢出的原因是字长为n+1 位时,数值部分为n位,数值
部分的最大绝对值为 2
n
。如果参加运算的两个数x和y的绝对值都小于 2
n
,则(+x)+(-y)和
(-x)+(+y)的绝对值都不会大于 2
n
,因此只需考虑(+x)+(+y)和(-x)+(-y)的情况,这时结果z
的符号应与x和y的符号相同,即当x
0
=1 且y
0
=1 时,z
0
=0 说明数据溢出;或者当x
0
=0 且y
0
=0
时,z
0
=1 说明数据溢出。这样可列出下表所示的判断逻辑的真值表。
x
0
y
0
z
0
V
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 0
根据真值表,可得判断溢出的逻辑表达式:
这种溢出判断方法不仅需要判断加法运算的结果,而且需要保持原操作数。
(2)利用数据编码的最高位(符号位)和次高位(数值部分的最高位)的进位状况来
判断运算结果是否发生了溢出。