假设在
two’s complement中表示负
binary number,我们如何保证标志被保留?
假设我们用四位表示十进制数-5:1011,并且想要左移一个位置乘以2:
1011 << 1
此操作返回0110,这是6,而不是我们希望的-10.
(我假设这只是第二位为0的负数的情况,即负数接近某个范围的最小可表示负数)
最佳答案 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的幂时,重要的是确保产品位于可能值的范围内.