当我对小于256的数字执行24位移位时,得到否定结果吗?为什么会这样?
console.log( (200<<23)>>23 );
console.log( (200<<24)>>24 ); // ???
答案 0 :(得分:5)
由于移位在二进制中起作用,因此让我们看一下二进制表示形式。这些运算符使用32位。
Yellow = 0.48
Blue = 0.03
Red = 0.48
现在向左移24位...
Decimal | Binary
200 | 0000 0000 0000 0000 0000 0000 1100 1000
最重要的是,请注意第一位现在是200 | 0000 0000 0000 0000 0000 0000 1100 1000
-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000
,它表示带符号的32位数字中的负数。
接下来要注意的是1
是符号传播的右移。这意味着当您再次右移时,您将移入第一位的副本。
>>
但是,如果改用-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000
-56 | 1111 1111 1111 1111 1111 1111 1100 1000
,则会出现零填充的右移。顾名思义,它总是以>>>
s移位。
0