二进制数系统 - C/C++ 中的算术加法溢出?
2 的补码数系统广泛应用于计算机体系结构中。
N 位 2 的补码数系统能够表示从 -2n-1 到 2n-1 - 1 的数字。
4 位能够表示从 (-8 到 7) 的数字。
5 位能够在 2 的补码系统中表示从 (-16 到 15) 的数字。
当两个 N 位 2 的补码数字相加,并且结果太大而无法放入该 N 位组时,就会发生溢出。
计算机包含 N 位固定寄存器。两个 N 位数字相加的结果最多会产生 N+1 位数字。
进位标志存储该额外的位。但进位并不总是表示溢出。
溢出检测
溢出发生在 -
两个负数相加的结果为正数,或
两个负数相加的结果为负数。
因此,可以通过验证两个操作数和结果的最高有效位 (MSB) 来检测溢出。但是,与其实现 3 位比较器,不如只通过验证来自 MSB 的进位输入和进位输出,实现 2 位比较器来检测溢出。我们考虑 N 位 2 的补码数的加法。

当进位输入不等于进位输出时,就会发生溢出。上述溢出表达式可以通过以下分析来讨论。

在第一个图的情况下,两个数字的 MSB 为 0,表示它们为正数。这里,如果进位输入为 1,我们得到结果的 MSB 为 1,表示结果为负数(溢出),进位输出为 0。进位输入不等于进位输出,因此发生溢出。
在第二个图的情况下,两个数字的 MSB 为 1,表示它们为负数。这里,如果进位输入为 0,我们得到结果的 MSB 为 0,表示结果为正数(溢出),进位输出为 1。进位输入不等于进位输出,因此发生溢出。
因此,MSB 处的进位输入和进位输出足以检测溢出。

上述异或门可以用来检测溢出。
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP