减去两个未知bitesize的值

时间:2011-06-25 20:25:43

标签: c++ math subtraction twos-complement

我正在尝试使用twos compliment从彼此中减去两个值。我有溢出位的问题。由于我的容器保持一个无限位大小的整数,我不知道结果的最高位是真的来自结果还是溢出。如何在不使用-的情况下摆脱溢出(我不能只做1 << bits - 1,因为那将涉及使用容器,它还没有工作operator-

0b1111011111 - 0b111010000 -> 0b1111011111 + 0b000110000 -> 1000001111

vs(通常)

0b00000101 - 0b000000001 -> 0b00000101 + 0b11111111 -> 0b100000100 -> 0b00000100

2 个答案:

答案 0 :(得分:2)

如果你计算a -b,你必须以某种方式“排列”这个词 - 因为你必须为2补语做出否定,m = max(bitwidth(a),bitwidth(b))的位宽。

为了摆脱溢出,你只需要做掩码=否定(1 <&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; m),然后按位和应用掩码。 (或者你可以检查一下并相应地对待它。)

答案 1 :(得分:0)

您的问题是您要从10位111010000中减去9位1111011111111010000的两个补码为...11111000110000,其中的点试图表明您必须使用尽可能多的1位填充左侧。在这里,您需要10位,因此111010000的两位补码不是000110000而是1000110000

所以你想要计算1111011111 + 1000110000 = 11000001111,你只需截断到10位就可以得到正确答案1000001111