【问题标题】:Bitshift operators description in Java language specificationJava 语言规范中的位移位运算符描述
【发布时间】:2017-07-13 08:42:22
【问题描述】:

在 JLS8 中指定 §JLS-15.19

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

我不清楚这个粗体的声明。非常感谢一个例子。

【问题讨论】:

    标签: java bit-shift jls


    【解决方案1】:

    Java 利用 C 和 C++ 世界的编译器优化。对于 32 位 int,使用大于或等于 31 的位移参数会将结果值设置为 0,以获得正值 int。 (对于否定论点,C 和 C++ 中的移位行为是实现定义的)。

    而在 C 和 C++ 中,实际上为 32 位 int 使用大于 31 的值实际上是未定义的行为,Java 模块实际上已经专门定义了该行为并简单地执行了转换使用参数模 32(这是大多数 C 和 C++ 编译器实际执行的操作)。您引用的 JLS sn-p 中明确提到了此方法。

    提取一个数的最低五位相当于取该数模 32。

    【讨论】:

    • 我不清楚粗体的陈述。如果你能告诉我一个例子,我需要一个例子
    • 我添加了最后一句话。还是不清楚吗?
    • 其实最后一句话就是我想要的。我想,我需要回到蒙面。顺便说一句谢谢
    • 对我来说,这体现了为什么我认为每个程序员都应该有 C 的基础。对我来说,C 是从语言实验的原始汤中出现的第一个活的语言.
    • 我其实是,但现在我真的需要回到那里获得更多的基础。
    最近更新 更多