【发布时间】:2014-02-23 06:47:50
【问题描述】:
所以当我读这本书时,它说添加不同的符号和减去相同的符号时不会发生溢出。 但是当我这样做时我有疑问:185 - 122 我将 122 的二进制转换为 2s 补码并进行了加法,这是不同的符号: 185+(-122) 当我把它们加在一起时,我得到符号位溢出到 100111111。但是如果我切断左边的 MSB,这是正确的答案。是不是溢出了?
【问题讨论】:
标签: overflow integer-arithmetic
所以当我读这本书时,它说添加不同的符号和减去相同的符号时不会发生溢出。 但是当我这样做时我有疑问:185 - 122 我将 122 的二进制转换为 2s 补码并进行了加法,这是不同的符号: 185+(-122) 当我把它们加在一起时,我得到符号位溢出到 100111111。但是如果我切断左边的 MSB,这是正确的答案。是不是溢出了?
【问题讨论】:
标签: overflow integer-arithmetic
不,它不是溢出 - 在 MSB 中添加 2 1's 导致的溢出必须被丢弃。来自Wikipedia
为了得到二进制数的二进制补码,使用按位非运算将位反转或“翻转”;然后将 1 的值添加到结果值中,忽略取 0 的二进制补码时发生的溢出。
所以在你的例子中
185 10111001
122 01111010 -
取122的2的补码(一个补码+1)
01111010 => 10000110
添加:
10111001 185
10000110 +(-122)
--------
00111111 (63)
=63
overflow 被忽略。
但是,在执行 2 的补码后检测溢出有一些规则:
【讨论】:
SUB 在英特尔上减去)