【发布时间】:2017-07-13 08:42:22
【问题描述】:
在 JLS8 中指定 §JLS-15.19
如果左侧操作数的提升类型是 int,那么只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移动距离总是在 0 到 31 的范围内,包括 0 到 31。
我不清楚这个粗体的声明。非常感谢一个例子。
【问题讨论】:
在 JLS8 中指定 §JLS-15.19
如果左侧操作数的提升类型是 int,那么只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移动距离总是在 0 到 31 的范围内,包括 0 到 31。
我不清楚这个粗体的声明。非常感谢一个例子。
【问题讨论】:
Java 利用 C 和 C++ 世界的编译器优化。对于 32 位 int,使用大于或等于 31 的位移参数会将结果值设置为 0,以获得正值 int。 (对于否定论点,C 和 C++ 中的移位行为是实现定义的)。
而在 C 和 C++ 中,实际上为 32 位 int 使用大于 31 的值实际上是未定义的行为,Java 模块实际上已经专门定义了该行为并简单地执行了转换使用参数模 32(这是大多数 C 和 C++ 编译器实际执行的操作)。您引用的 JLS sn-p 中明确提到了此方法。
提取一个数的最低五位相当于取该数模 32。
【讨论】: