这是假的:
(0xffffffff << 31 << 1) === (0xffffffff << 32)
似乎应该是真的。在任何地方添加>>> 0
都不会改变这种情况。
为什么会这样,我如何才能正确编写处理<< 32
的代码?
答案 0 :(得分:10)
移位运算符始终有效具有0-31范围内的右操作数。
移位运算符以big-endian顺序将其操作数转换为32位整数,并返回与左操作数相同类型的结果。右操作数应小于32,但如果不仅使用低5位。
生产ShiftExpression:ShiftExpression&lt;&lt; AdditiveExpression的计算方法如下:
- 让 lref 成为评估 ShiftExpression 的结果。
- 让 lval 为GetValue( lref )。
- 让 rref 成为评估 AdditiveExpression 的结果。
- 让 rval 为GetValue( rref )。
- 让 lnum 为ToInt32( lval )。
- 让 rnum 为ToUint32( rval )。
- 设* shiftCount是屏蔽除了&gt;之外的所有但最不重要的5位的结果。 rnum ,即计算 rnum &amp;为0x1F。
- 通过 shiftCount 位返回左移 lnum 的结果。结果是带符号的32位整数。
醇>
(同样适用于其他班次运营商。)
我并不完全清楚为什么会这样,但Java和C#对于32位整数类型的工作方式相同。 (对于64位整数类型,操作数的范围为0-63。)例如,请参阅JLS 15.19。
我的猜测是这在普通处理器平台上有效,但我没有证据......