【问题标题】:Is this an overflow arithmetic calculation?这是溢出算术计算吗?
【发布时间】:2014-02-23 06:47:50
【问题描述】:

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

【问题讨论】:

    标签: overflow integer-arithmetic


    【解决方案1】:

    不,它不是溢出 - 在 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 的补码后检测溢出有一些规则:

    • 如果两个正数相加的结果为负数
    • 如果两个负数相加得出正结果

    【讨论】:

    • @Rozen - 这里有一些进一步的答案stackoverflow.com/q/6853524/314291 关于为什么 CPU / ALU 在内部使用 2 的补码。显然,作为最终用户,我们只会例如使用SUB 在英特尔上减去)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多