在 JLS8 §JLS-15.19 中指定
如果左操作数的提升类型为 int,则仅使用右操作数的五个最低阶位作为移位距离。就好像右操作数受到按位逻辑 AND 运算符 & (§15.22.1( 的影响,掩码值0x1f (0b11111(。因此,实际使用的换档距离始终在 0 到 31 的范围内(包括 0 到 31(。
我不清楚粗体字的这个陈述.一个例子非常值得赞赏。
它是Java利用C和C++世界的编译器优化。对于 32 位int
,使用大于或等于 31 的位移参数会将正int
的结果值设置为 0。(对于否定论点,C 和 C++ 中关于移位的行为是实现定义的(。
而在 C 和 C++ 中,实际上对 32 位int
使用大于 31 的值实际上是未定义的行为,Java bods 实际上已经专门定义了行为,并且只是使用参数模 32 执行移位(这是大多数 C 和 C++ 编译器实际所做的(。此方法在您引用的 JLS 代码段中明确提及。
提取一个数字的最低五阶位相当于取该数字模 32。