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

opt*_*nal 2 java bit-shift jls

在JLS8的§JLS-15.19中指定

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

我不清楚这个陈述是粗体.非常感谢一个例子.

Bat*_*eba 7

它是Java利用来自C和C++世界的编译器优化.对于32位int,使用大于或等于31的位移参数将结果值设置为0表示正数int.(对于否定参数,C和C++中关于移位的行为是实现定义的).

实际上在C和C++中,实际上对32位使用大于31的值int实际上是未定义的行为,Java实际上已经明确地定义了行为,并且简单地使用模32的参数执行移位(这是C的大部分内容)和C++编译器实际上).您引用的JLS代码段中明确提到了此方法.

提取数字的最低五位相当于将该数字取模32.

  • 对我来说,这就是为什么我认为*每个*程序员应该在C语言中有基础的原因.对我来说,C语言是第一个从语言实验的原始语言中产生的现存语言. (2认同)