二进制加法中的下溢和上溢

Underflow and Overflow in binary addition

如果是:

0b10001111+0b10011000 = 0b100100111 

是下溢的情况吗?因为这两项是负数,结果是正数?

我们什么时候会溢出?因为第 9 位将始终为 1?当第 8 位均为 1

0b1000 1111+0b1001 1000 = 0b1 0010 0111

将进位作为结果的第 n+1 位包含在 无意义 中用于 2s 补码。你能做的就是坚持原来的尺寸

0b1000 1111+0b1001 1000 = 0b0010 0111 // invalid

或者将操作数扩展到n+1位,得到n+1位的结果。

0b1 1000 1111+0b1 1001 1000 = 0b1 0010 0111 //valid

原因是 2s 补码的工作原理是将 2^n 加到负整数上,使它们成为正数。 (要编码a<0=-|a|,使用2^n+a 或2^n -|a|,即|a| 的2^n 的补码,因此得名2s 补码)。

这很好,因为编码值为 (2^n)+a if a<0 或 a if a≥0,如果忽略 2^n,则可以进行有符号整数加法而不用担心操作数的符号。但是你必须忽略执行(除了有效性方面的问题)。

要获得准确的有效性规则,您必须考虑不同的情况:

1/A,B>=0

结果有效,当且仅当 MSB=0 ⇒ c_n-1=0(我们总是 c_n=0)

2/ A,B<0

结果有效,当且仅当 MSB=1 ⇒ c_n-1=1(我们总是有 c_n=1)

3/ A>=0, B<0

结果不能太正或太负并且总是有效的。我们总是 c_n=c_n-1

我们可以看到,判断一个结果是否有效的全局规则是c_n==c_n-1(或者c_n⊕c_n-1表示溢出)。

还有许多其他等效规则。例如:
如果 (sign(A) != sign(B)) 或 ((sign (A) == sign(B)) and (sign(A)==sign(A+B))
,则结果有效 在 C 中可以表示为
((a^b) | (a^~(a+b)))&(1<< sizeof (int) -1)