假设binary number表示否定two's complement,我们如何保证该符号会被保留?
假设我们用四位代表一个十进制数-5
:1011
,并希望左移一个地方乘以2:
1011 << 1
此操作返回0110,即6,不是-10,正如我们希望的那样。
(我假设这只是负数的情况,其第二位为0,即负数接近某个范围的最小可表示负数)
答案 0 :(得分:3)
OP在这里。我找到了问题的答案。
向左移动可能会触发arithmetic overflow。
two's complement系统可表达的数字范围是-(2^(n-1))
到2^(n-1)-1
,其中n
是可用的位数,包括符号位(MSB)。因此,在上面的示例中,每个数字使用4位,可能值的范围为-8
到7
,包括在内。
向左移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的幂时,确保产品位于可能值的范围内非常重要。