当我对小于 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/

10-13 01:54