(-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

+0

thx为您的答复和抱歉发布重复的问题。这解释得很好。 – paranoid