为什么在JavaScript中0x80000000 >> 1会产生负值?

5

使用JavaScript进行位运算和移位的测试

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

我预计它会返回0x40000000,因为
0x40000000 >> 1 // returns 0x20000000
0x20000000 >> 1 // returns 0x10000000

3
这是因为0x800...相当于0b10000...,将其向右移一位后变成了0b1100...,即一个负数。另一方面,0x400...相当于0b0100...,0x200...相当于0b0010...,它们没有这个问题。 - NullUserException
@NullUserException 对不起,如果这是非常基础的东西,但为什么它不变成0b0100...?0x80..可以被移位以产生正0x40..吗? - lostsource
@NullUserException:应该是一个答案。 - Lightness Races in Orbit
@lostsource:因为没有任何东西可以“覆盖”那个最高有效位的原始值。通常,在执行移位操作后,您会使用&掩码。 - Lightness Races in Orbit
谢谢大家提供的信息,我现在明白了算术移位逻辑移位之间的区别。 - lostsource
2个回答

10

这是一个算术移位,因此符号被保留,要执行逻辑移位请使用>>>

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

4
在Javascript中,>>是“有符号右移位运算符”。在语言规范的§11.7.2中写道:
执行由右操作数指定的数量的填充有符号位的右移位操作符于左操作数上。
在进行移位操作之前,左侧操作数将被转换为有符号32位整数(在规范给出的算法的步骤5中)。在您的情况下,此转换将给定的正数转换为负值。之后,实际的移位操作被执行,保留该值的负号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接