0

为什么(-1 >>> 32)Java中的表达式被评估为-1而不是0预期的?-shift >>>-operator 应填充前面的 0,因此结果应将所有位设置为 0。

这很奇怪,因为它破坏了>>>: 例如(-1 >>> x)将前 x 位设置为 0的语义0 <= x <= 31。唯一的(意外的)异常是 32。

这是故意的行为、错误还是(过度激励的)编译器优化?

我使用表达式~(-1 >>> x)将 cidr-netmask 扩展为等效的 32 位,但看起来 /32-masks 必须单独处理。

4

1 回答 1

1

检查这篇文章

来自答案作者Rasmus Faber的引述

来自 Java 语言规范:

如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数经过位逻辑与运算符 & (§15.22.1) 与掩码值 0x1f。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。

简而言之:由于操作数范围限制,-1 >>> 32相当于-1 >>> 0which is -1

于 2013-07-26T09:37:01.100 回答