我正在尝试使用twos compliment从彼此中减去两个值。我有溢出位的问题。由于我的容器保持一个无限位大小的整数,我不知道结果的最高位是真的来自结果还是溢出。如何在不使用-
的情况下摆脱溢出(我不能只做1 << bits - 1
,因为那将涉及使用容器,它还没有工作operator-
0b1111011111 - 0b111010000 -> 0b1111011111 + 0b000110000 -> 1000001111
vs(通常)
0b00000101 - 0b000000001 -> 0b00000101 + 0b11111111 -> 0b100000100 -> 0b00000100
答案 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位1111011111
。 111010000
的两个补码为...11111000110000
,其中的点试图表明您必须使用尽可能多的1
位填充左侧。在这里,您需要10位,因此111010000
的两位补码不是000110000
而是1000110000
。
所以你想要计算1111011111 + 1000110000 = 11000001111
,你只需截断到10位就可以得到正确答案1000001111
。