sga*_*a62 6 binary bit-manipulation bit-shift negative-number twos-complement
假设我们-5用四位表示一个十进制数:1011,并想将一个数左移乘以2:
1011 << 1
Run Code Online (Sandbox Code Playgroud)
此操作返回0110,它是6,而不是我们希望的-10。
(我假设这仅适用于第二位为0的负数,即负数接近某个范围的最小可表示负数)
在这里。我找到了我的问题的答案。
左移可能会触发算术溢出。
二进制补码系统可表示的数字范围是从-(2^(n-1))到2^(n-1)-1,其中n是可用的位数,包括符号位 (MSB)。因此,在上面每个数字使用 4 位的示例中,可能值的范围是-8至7,包括。
左移位m将使数字乘以2^m。因此,在上面的示例-5 << 1中将 yield -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
Run Code Online (Sandbox Code Playgroud)
总之,在使用 ASL 乘以 2 的幂时,重要的是要确保乘积在可能值的范围内。