如果是:
0b10001111+0b10011000 = 0b100100111
下溢的情况?因为这两个长期为负,其结果是积极的?
我们什么时候会得到溢出?作为第9位将始终为1?当两个第八比特是1
0b1000 1111 + 0b1001 1000 = 0B1 0010 0111
包括进位为N +结果的1号位无意义二进制补码。你可以做的是要么粘在原来的大小
0b1000 1111 + 0b1001 1000 = 0b0010 0111 //无效
或扩展操作数n + 1位,并获得n + 1位的结果。
0B1 1000 1111 + 1001 0B1 1000 = 0B1 0010 0111 //有效
其原因是,2S加入2 ^ n至负整数,使他们积极配合工作。 (编码一个<0 = - | A |,使用2 ^ N + A或2 ^ N - | A |,即,补充2 ^ N的| A |,2的补码的因此而得名)。
这是很大的,作为编码值是(2 ^ N)+ A如果A <0或如果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表示溢出)。
还有许多其他同等规则。例如:
结果是有效的,如果(符号(A)!=符号(B))或((符号(A)==符号(B))和(符号(A)==符号(A + B))
这可以在C被表示为
((a^b) | (a^~(a+b)))&(1<< sizeof (int) -1)