在以下情况下:
0b10001111+0b10011000 = 0b100100111 是地下水流的情况吗?因为这两个词是负的,其结果是正的?
我们什么时候会有溢流?因为第9位永远是1?当第8位都是1
发布于 2019-02-07 17:54:27
0b1000 1111+0b1001 1000 = 0b1 0010 0111
包括进位作为n+1th位的结果对于2s补码来说毫无意义。你可以做的是要么坚持原来的尺寸
0b1000 1111+0b1001 1000 =0b00100111 //无效
或者将操作数扩展到n+1位,并得到n+1位的结果。
0b1 1000 1111+0b1 1001 000= 0b1 0010 0111 //有效
原因是2s补码的工作原理是在负整数中添加2^n,使其变为正数。(要编码一个<0=-声
这很好,因为编码值为(2^n)+a if a<0或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 1
我们可以看到,指示结果是否有效的全局规则是c_n ==c 1(或c_n⊕c_n-1表示溢出)。
还有许多其他类似的规则。例如:
如果(符号(A) !=符号(B)或(符号(A) ==符号(B))和(符号(A)==sign(A+B)),则结果是有效的。
可以用C表示为
((a^b) | (a^~(a+b)))&(1<< sizeof (int) -1)
https://stackoverflow.com/questions/54576374
复制相似问题