这个问题让我困惑了很长时间。如何在8位环境下检测0减法(-128)的溢出。
在课堂上,我的老师教我一种检测溢出的方法,方法如下:

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

在上述情况下,计算机可以检测溢出。但我不知道电脑是怎么做到的。
发布于 2018-11-13 17:21:22
你的计算中有一个错误。
在二的补码中减去两个数字并不是你在第二张图片中描述的那样。
图像显示的是加法,而不是减法,在减法中使用的是借入而不是进位。
borrow就是你犯错误的地方。
10000000 (borrow)
00000000 (0)
- 10000000 (-128)
----------
10000000 (-128)正如您所看到的,借入的前两个比特是不同的,因此1 XOR 0 = 1收益率溢出。
有关详细信息,请参阅Wikipedia。
附录
为了澄清为什么你的假设没有发生溢出,而实际上它发生了,在你的第二张图片中的加法计算中,是错误的:
00000000 (carry)
00000000 (0)
+ 10000000 (-128)
----------
10000000 (-128)因为0 + -128 = -128和0 XOR 0 = 0因此没有溢出。
在这种情况下,加法不会跨越-128 and 127边界。
让我们看一下只有4位的二进制补码的表示。

-8将代表-128。
如果按逆时针方向从0转到-8 (用于减法),您将看到边界(由红线表示)没有交叉,因此没有溢出。
如果我们以你的第一个例子7 + 1为例,从7开始顺时针(加法),你最终会到达-8,你已经越过了边界,因此溢出了。
你认为你在第二张图片中做的是0 + 128。您按顺时针方向(加法)从0转到-128。这越过了边界,但由于128不能用8位二进制补码表示,因此假设和计算都是错误的。
您假设0 + 128与0 - (-128)相同,但事实显然并非如此,因为如上所述,128不能用8位二进制补码表示。
https://stackoverflow.com/questions/53276523
复制相似问题