位操作-为什么0x80000000 >>JavaScript中的1生成一个负值

bit manipulation - Why does 0x80000000 >> 1 in JavaScript produce a negative value?

本文关键字:一个 中的 为什么 0x80000000 JavaScript 1生 位操作      更新时间:2023-09-26

使用JavaScript进行按位操作/移位的一些测试

0x80000000 >> 1 // returns -1073741824 (-0x40000000)

我希望返回0x40000000,因为

0x40000000 >> 1 // returns 0x20000000
0x20000000 >> 1 // returns 0x10000000

这是算术移位这就是为什么要保留符号的原因,要进行逻辑移位使用>>>

0x80000000 >>> 1 // returns 1073741824 (0x40000000)

在Javascript中,>>有符号右移操作符。在语言规范的§11.7.2中说:

在左操作数上按右操作数指定的量进行填号位右移操作。

在移位完成之前,将左操作数转换为有符号32位整数(规范中给出的算法的第5步)。在您的示例中,此转换将给定的正数转换为负值。之后,实际移动完成,保留值的负号。