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

时间:2014-06-18 14:22:27

标签: javascript bit-manipulation unsigned bit-shift integer-overflow

这是假的:

(0xffffffff << 31 << 1) === (0xffffffff << 32)

似乎应该是真的。在任何地方添加>>> 0都不会改变这种情况。

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

1 个答案:

答案 0 :(得分:10)

移位运算符始终有效具有0-31范围内的右操作数。

来自the Mozilla docs

  

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

或者来自ECMAscript 5 standard

  

生产ShiftExpression:ShiftExpression&lt;&lt; AdditiveExpression的计算方法如下:

     
      
  1. lref 成为评估 ShiftExpression 的结果。
  2.   
  3. lval 为GetValue( lref )。
  4.   
  5. rref 成为评估 AdditiveExpression 的结果。
  6.   
  7. rval 为GetValue( rref )。
  8.   
  9. lnum 为ToInt32( lval )。
  10.   
  11. rnum 为ToUint32( rval )。
  12.   
  13. 设* shiftCount是屏蔽除了&gt;之外的所有但最不重要的5位的结果。 rnum ,即计算 rnum &amp;为0x1F。
  14.   
  15. 通过 shiftCount 位返回左移 lnum 的结果。结果是带符号的32位整数。
  16.   

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

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

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