(-1 >>> 32)== -1?
问题描述:
为什么Java中的表达式(-1 >>> 32)
按预期评估为-1
而不是0
?该>>>
-Shift运营商应填写前述0,所以结果应该具有的所有位设置为0。(-1 >>> 32)== -1?
这是奇怪的,因为它打破了>>>
语义:例如(-1 >>> x)
的前x位对所有0 <= x <= 31
设置为0。唯一的(意外的)例外是32.
这是故意的行为,错误还是(过度动机的)编译器优化?
我使用表达式~(-1 >>> x)
来扩展一个cidr-netmask到它的32位等价物,但是看起来,必须单独处理/ 32-掩码。
答
检查this post。
从回答笔者Rasmus Faber
报价从Java语言规范:
如果左侧操作数升级后的类型为int,只有在五 最低阶位右侧操作数被用作移动距离 。就好像右边的操作数受掩码值为0x1f的 按位逻辑AND运算符&(第15.22.1节)。 实际使用的换档距离总是在0到 31之间(含)。
龙简称:由于操作数范围限制,-1 >>> 32
相当于-1 >>> 0
这是-1
。
thx为您的答复和抱歉发布重复的问题。这解释得很好。 – paranoid