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

假设在
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的幂时,重要的是确保产品位于可能值的范围内.

点赞