【问题标题】:(-1 >>> 32) == -1? [duplicate](-1 >>> 32) == -1? [复制]
【发布时间】:2013-07-26 09:24:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java expression operator-keyword bit-shift shift


    【解决方案1】:

    检查this post

    来自答案作者Rasmus Faber的引用

    来自 Java 语言规范:

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

    简而言之:由于操作数范围限制,-1 >>> 32 等价于 -1 >>> 0,即-1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2022-01-17
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      相关资源
      最近更新 更多