【发布时间】:2014-03-28 14:45:04
【问题描述】:
如果我使用Two's Complement方法添加两个有符号二进制数,如果进位到MSB(符号)和进位不同,为什么会自动表示发生溢出?
【问题讨论】:
-
我不得不说,这是我加入 SO 以来最喜欢回答的问题。抱歉这么久才有人回复。
如果我使用Two's Complement方法添加两个有符号二进制数,如果进位到MSB(符号)和进位不同,为什么会自动表示发生溢出?
【问题讨论】:
让我们把一个事实排除在外。
当我们添加一个负数和一个正数操作数时,结果将始终在表示范围内。当我们将两个具有相同符号(都为正或都为负)的数字相加并且结果具有相反的符号时,就会发生溢出。
当我们在二进制补码中添加数字时,我们将第一个操作数的符号位与第二个操作数的符号位相加。
当我们添加正+正操作数时,符号位之和为0。
0XXX (positive)
+ 0XXX (positive)
------
0XXX (positive)
这意味着无论发生什么,添加正+正操作数时都不会出现进位。
所以,如果符号位有进位
1
0XXX (positive)
+ 0XXX (positive)
------
1XXX (negative)
那个携带位 1 将成为结果的符号。这意味着我们添加了两个正操作数,结果得到了一个负数。
执行 = 0
进位符号位 = 1
溢出!
当我们添加负+负操作数时,符号位的总和为0,并带有进位。
1XXX (negative)
+ 1XXX (negative)
------
10XXX (positive)
这意味着无论发生什么都无关紧要,添加负+负操作数时总会有进位。请注意,默认情况下,结果将是一个正数。它“需要”继续将结果调整为操作数的相同符号。如果符号位有进位,我们将有两个负操作数,结果为负。
所以,如果有没有进位到符号位
0
1XXX (negative)
+ 1XXX (negative)
------
10XXX (positive)
那个携带位 0 将成为结果的符号。这意味着我们添加了两个负操作数,结果得到了一个正数。
执行 = 1
进位符号位 = 0
溢出!
【讨论】: