二进制数系统 - C/C++ 算术加法中溢出?

cc++server side programmingprogramming

2 的补数系统在计算机体系结构中得到广泛实现。

N 位 2 的补数系统可以表示从 -2n-1 到 2n-1-1 的数字

4 位可以表示从 (-8 到 7) 的数字

5 位可以在 2 的补数系统中表示从 (-16 到 15) 的数字。

当添加 2 个 N 位 2 的补数并且答案太大而无法放入该 N 位组中时,会发生加法溢出。

计算机包含 N 位固定寄存器。两个 N 位数相加的结果将产生最大 N+1 位数。

进位标志存储该额外位。但进位并不总是指定溢出。

溢出检测

溢出发生在以下情况下 −

  • 两个负数相加的结果为正或

  • 两个负数相加的结果为负。

因此,可以通过验证两个操作数和结果的最高有效位 (MSB) 来检测溢出。但除了实现 3 位比较器外,还可以通过仅验证 MSB 的进位输入和进位输出来检测溢出,只需实现 2 位比较器即可。我们考虑 2 的补码数的 N 位加法。

当进位输入不等于进位输出时,就会发生溢出。上面的溢出表达式可以从下面的分析中讨论。

在第一个图中,两个数字的 MSB 为 0,表示它们为正数。这里,如果进位输入为 1,我们得到结果的 MSB,因为 1 表示结果为负数(溢出),而进位输出为 0。进位输入不等于进位输出,因此溢出。

在第二个图中,两个数字的 MSB 为 1,表示它们为负数。这里,如果进位输入为 0,我们得到结果 MSB,因为 0 表示结果为正(溢出),而进位输出为 1。进位输入不等于进位输出,因此溢出。

因此 MSB 的进位输入和进位输出足以检测溢出。

上述 XOR 门可用于检测溢出。


相关文章