binary - 在2C中添加多个二进制数后如何检测溢出?
问题描述
假设我想在 2 的补码中添加 4 个二进制数:a+b+c+d。我有一个可以一次添加 2 个二进制数的电路,它可以检测相应的和是否发生溢出(通过使用 XOR 和最后一个进位位)。
在 2 的补码中添加多个数字时,中间和可能会溢出,而最终结果不会。例如:
4 + 5 + (-6) 用 4 位和 C2 表示:
0100 +
0101
====
1001 (-7 : overflow)
1001 +
1010
====
0011 (3, the correct result)
我的问题是:我怎么知道,当将 4 个二进制数与 N 位相加时,最终结果是否溢出?是否有任何逻辑表达式或电路可以自动检测何时发生溢出?
解决方案
在您的示例中,用 4 位表示的 0100 + 0101 给出了 1001 的硬件结果。
现在取决于您如何解释这些位。
如果将它们解释为 2 的补码整数,则结果是错误的(十进制 -7,溢出)。
如果将它们解释为无符号整数,则结果是正确的(十进制 9)。
如果你加上 1010,你必须考虑如何解释这些位。无符号,它们是十进制的 10,2 的补码,它们是十进制的 -6。
不过,如何解释结果取决于您。它是 0011 加上一个进位位,因为 1001 + 1010 给出 10011。
因此问题出现了,因为您在计算期间更改了位的解释。
这是任何逻辑表达式或电路都无法处理的。
推荐阅读
- javascript - How to apply gravity to a projectile that has directional velocity?
- php - 在 mPDF 中添加 CSS 只会创建额外的空白页
- python - 2D numpy 数组:删除被屏蔽的元素
- python - 如何在 Python 中保留 `exec()` 中定义的值
- ios - 在应用程序被杀死/强制退出时设置徽章计数
- javascript - Angular 4 Semantic UI Tabs 仅在刷新后工作
- android - 主页加载前启动图像后的白屏
- linux - Linux 特定部分的搜索和替换
- uwp - UWP - 单击其中的按钮时如何选择 ListViewItem
- google-chrome - 越过验证码 - Selenium