0

我正在尝试使用二进制补码将两个值相减。我有溢出位的问题。由于我的容器包含一个无限位大小的整数,我不知道结果的最高位是真的来自结果还是只是溢出。我如何在不使用的情况下摆脱溢出-(我不能这样做1 << bits - 1,因为这将涉及使用operator-尚未工作的容器)

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

vs(通常)

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

4

2 回答 2

2

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

要摆脱溢出,您只需执行 mask = negate(1 << m),然后使用按位与应用掩码。(或者您可以检查该位并相应地对待它)。

于 2011-06-25T20:50:29.093 回答
0

您的问题是您111010000要从 10-bit 中减去 9-bit 1111011111111010000is的二进制补码...11111000110000,其中的点试图表明您必须根据需要向左侧填充尽可能多的1位。在这里,您需要 10 位,因此111010000is not 000110000but的二进制补码1000110000

因此,您要计算1111011111 + 1000110000 = 11000001111,只需将其截断为 10 位即可得到正确答案1000001111

于 2011-06-25T21:20:54.227 回答