当我对小于 256 的数字执行 24 位移位时,得到的结果是否定的?这是为什么?
console.log( (200<<23)>>23 );
console.log( (200<<24)>>24 ); // ???
最佳答案
由于位移以二进制方式工作,让我们看看二进制表示。 32 位用于这些运算符。
Decimal | Binary
200 | 0000 0000 0000 0000 0000 0000 1100 1000
现在左移 24 个位置...
200 | 0000 0000 0000 0000 0000 0000 1100 1000
-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000
最重要的是,请注意第一位现在是
1
,它表示有符号 32 位数字中的负数。接下来要注意的是
>>
是一个符号传播右移。这意味着当您再次右移时,您正在移动第一位的副本。-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000
-56 | 1111 1111 1111 1111 1111 1111 1100 1000
但是,如果您改用
>>>
,则会得到零填充右移。顾名思义,它总是在 0
中移动。-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000
200 | 0000 0000 0000 0000 0000 0000 1100 1000
关于javascript - 为什么移位 24 位会导致负值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56060799/