如何在8位环境中检测0减-128溢出?

时间:2018-11-13 08:12:43

标签: assembly digits

这个问题使我困惑了很长时间。在0减去(-128)的情况下如何检测溢出 8位环境。

在课堂上,我的老师教我一种方法 要检测溢出,方法如下:

method worked

但是在这种情况下不起作用:

method not worked

上述情况计算机可以检测到溢出。但是我不知道计算机是怎么做到的。

1 个答案:

答案 0 :(得分:1)

您的计算有误。
在二的补码中减去两个数字并不是您在第二张图像中的描绘方式。

该图像显示加法,而不是减法,在减法中,您使用借用而不是进位borrow是您犯错的地方。

 10000000  (borrow)
  00000000 (0)
- 10000000 (-128)
----------
  10000000 (-128)

如您所见,借位的前两位不同,因此1 XOR 0 = 1产生溢出。

有关更多信息,请参见Wikipedia

附录

要弄清为什么您认为没有发生溢出的事实,实际上在第二张图像的加法计算中是错误的:

 00000000  (carry)
  00000000 (0)
+ 10000000 (-128)
----------
  10000000 (-128)

由于0 + -128 = -1280 XOR 0 = 0因此没有溢出。
在这种情况下,添加项不会跨越-128 and 127边界。

让我们看看仅用4位表示二进制补码的情况。

Two's complement number circle

-128将由-8表示。
如果您逆时针从0-8(用于减法),您会看到边界(由红线表示)没有越过,因此没有溢出。

如果我们以第一个示例为7 + 1,并从7开始顺时针(加法),您将到达-8,您已经越过边界,因此溢出。

您认为第二张图片中的内容是0 + 128。您从0-128 顺时针(添加)。这样越过边界,但是由于128无法用8位二进制补码表示,因此假设和计算是错误的。

您假设0 + 1280 - (-128)相同,但显然并非如此,因为如上所述128不能用8位二进制补码表示。