为什么<< 32在javascript中不会导致0?

Kil*_*roy 2 javascript unsigned bit-manipulation integer-overflow bit-shift

这是假的:

(0xffffffff << 31 << 1) === (0xffffffff << 32)
Run Code Online (Sandbox Code Playgroud)

看起来应该是真的.添加>>> 0任何地方都不会改变这一点

为什么这样,我怎样才能正确编写处理的代码<< 32

Jon*_*eet 10

移位运算符总是有效地具有0-31范围内的右操作数.

来自Mozilla文档:

移位运算符以big-endian顺序将其操作数转换为32位整数,并返回与左操作数相同类型的结果.右操作数应小于32,但如果不是,则仅使用低5位.

或者来自ECMAscript 5标准:

生产ShiftExpression:ShiftExpression << AdditiveExpression的计算方法如下:

  1. lref成为评估ShiftExpression的结果.
  2. lval为GetValue(lref).
  3. rref成为评估AdditiveExpression的结果.
  4. rval为GetValue(rref).
  5. lnum成为ToInt32(lval).
  6. rnum成为ToUint32(rval).
  7. 设*shiftCount是屏蔽除> rnum的最低有效5位之外的所有位的结果,即计算rnum和0x1F.
  8. 通过shiftCount位返回左移lnum的结果.结果是带符号的32位整数.

(同样适用于其他班次运营商.)

我并不完全清楚为什么会这样,但Java和C#对于32位整数类型的工作方式相同.(对于64位整数类型,操作数的范围为0-63.)例如,参见JLS 15.19.

我的猜测是这在普通的处理器平台上是有效的,但我没有证据证明......