【问题标题】:Two's complement detect overflow with carries二进制补码检测带有进位的溢出
【发布时间】:2014-03-28 14:45:04
【问题描述】:

如果我使用Two's Complement方法添加两个有符号二进制数,如果进位到MSB(符号)和进位不同,为什么会自动表示发生溢出?

【问题讨论】:

  • 我不得不说,这是我加入 SO 以来最喜欢回答的问题。抱歉这么久才有人回复。

标签: overflow twos-complement


【解决方案1】:

让我们把一个事实排除在外。

当我们添加一个负数和一个正数操作数时,结果将始终在表示范围内。当我们将两个具有相同符号(都为正或都为负)的数字相加并且结果具有相反的符号时,就会发生溢出。

当我们在二进制补码中添加数字时,我们将第一个操作数的符号位与第二个操作数的符号位相加。


当我们添加正+正操作数时,符号位之和为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
溢出!

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2017-07-17
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多