Java 语言规范中的位移运算符描述



在 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。

最新更新