当左移两个补码中的负数时,保证负面结果?

时间:2014-10-06 20:52:26

标签: binary bit-manipulation bit-shift twos-complement negative-number

假设binary number表示否定two's complement我们如何保证该符号会被保留?

假设我们用四位代表一个十进制数-51011,并希望左移一个地方乘以2:

1011 << 1

此操作返回0110,即6,不是-10,正如我们希望的那样

(我假设这只是负数的情况,其第二位为0,即负数接近某个范围的最小可表示负数)

1 个答案:

答案 0 :(得分:3)

OP在这里。我找到了问题的答案。

向左移动可能会触发arithmetic overflow

two's complement系统可表达的数字范围是-(2^(n-1))2^(n-1)-1,其中n是可用的位数,包括符号位(MSB)。因此,在上面的示例中,每个数字使用4位,可能值的范围为-87,包括在内。

向左移m位会将数字乘以2^m。因此,在上面的示例中,-5 << 1会产生-10,这超出了4位有符号表示中可能数字的范围 - 这是溢出。

1111 << 1 == 1110 // -1 * 2 is -2
1110 << 1 == 1100 // -2 * 2 is -4
1101 << 1 == 1010 // -3 * 2 is -6
1100 << 1 == 1000 // -4 * 2 is -8
1011 << 1 == 0110 // overflow
1010 << 1 == 0100 // overflow
1001 << 1 == 0010 // overflow
1000 << 1 == 0000 // overflow

总之,在使用ASL乘以2的幂时,确保产品位于可能值的范围内非常重要。