首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在8位环境下检测0减-128溢出?

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

Stack Overflow用户
提问于 2018-11-13 16:12:43
回答 1查看 160关注 0票数 0

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-11-13 17:21:22

你的计算中有一个错误。

在二的补码中减去两个数字并不是你在第二张图片中描述的那样。

图像显示的是加法,而不是减法,在减法中使用的是借入而不是进位。

borrow就是你犯错误的地方。

代码语言:javascript
运行
复制
 10000000  (borrow)
  00000000 (0)
- 10000000 (-128)
----------
  10000000 (-128)

正如您所看到的,借入的前两个比特是不同的,因此1 XOR 0 = 1收益率溢出。

有关详细信息,请参阅Wikipedia

附录

为了澄清为什么你的假设没有发生溢出,而实际上它发生了,在你的第二张图片中的加法计算中,是错误的:

代码语言:javascript
运行
复制
 00000000  (carry)
  00000000 (0)
+ 10000000 (-128)
----------
  10000000 (-128)

因为0 + -128 = -1280 XOR 0 = 0因此没有溢出。

在这种情况下,加法不会跨越-128 and 127边界。

让我们看一下只有4位的二进制补码的表示。

-8将代表-128

如果按逆时针方向从0转到-8 (用于减法),您将看到边界(由红线表示)没有交叉,因此没有溢出。

如果我们以你的第一个例子7 + 1为例,从7开始顺时针(加法),你最终会到达-8,你已经越过了边界,因此溢出了。

你认为你在第二张图片中做的是0 + 128。您按顺时针方向(加法)从0转到-128。这越过了边界,但由于128不能用8位二进制补码表示,因此假设和计算都是错误的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53276523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档