2014-02-23 44 views
1

所以当我读了这本书,它说,当添加不同的符号和减去相同的符号时不会发生溢出。 但我有问题,当我这样做时:185 - 122 我把122的二进制转换为2s补码并做了加法,这是不同的符号: 185 +( - 122)当我将它们加在一起时,位溢出到100111111.但是,如果我切断左边的MSB,这是正确的答案。它是溢出吗?这是一个溢出算术计算吗?

回答

1

不,它不会溢出 - 在MSB中添加2 1's产生的溢出必须被丢弃。从Wikipedia

为了得到二进制数的二进制补码,通过使用按位NOT操作来反转位或“翻转”位;然后为1的值被添加到所得到的值,忽略服用0

所以二的补码在你的例子

185 10111001 
122 01111010 - 

服用2的122的补体时发生的溢流(One的补充+1)

01111010 => 10000110 

添加:

10111001 185 
10000110 +(-122) 
-------- 
00111111 (63) 

= 63

overflow被忽略。

但是也有做2的补后检测溢出的规则:

  • 如果两个正数结果为负结果
  • 如果总和两个负数结果的阳性结果
  • 总和
+0

@Rozen - 这里有一些进一步的答案http://stackoverflow.com/q/6853524/314291为什么CPU/ALU在内部使用2的补码。很明显,作为最终用户,我们只需要使用'SUB'来扣除英特尔) – StuartLC