这个问题使我困惑了很长时间。在0减去(-128)的情况下如何检测溢出 8位环境。
在课堂上,我的老师教我一种方法 要检测溢出,方法如下:
但是在这种情况下不起作用:
上述情况计算机可以检测到溢出。但是我不知道计算机是怎么做到的。
答案 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 = -128
和0 XOR 0 = 0
因此没有溢出。
在这种情况下,添加项不会跨越-128 and 127
边界。
让我们看看仅用4位表示二进制补码的情况。
-128
将由-8
表示。
如果您逆时针从0
到-8
(用于减法),您会看到边界(由红线表示)没有越过,因此没有溢出。
如果我们以第一个示例为7 + 1
,并从7
开始顺时针(加法),您将到达-8
,您已经越过边界,因此溢出。
您认为第二张图片中的内容是0 + 128
。您从0
到-128
顺时针(添加)。这样越过边界,但是由于128
无法用8位二进制补码表示,因此假设和计算是错误的。
您假设0 + 128
与0 - (-128)
相同,但显然并非如此,因为如上所述128
不能用8位二进制补码表示。