如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符& (§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移位距离始终在0到31的范围内,包括0和31。
我不清楚这句话的粗体。非常感谢一个例子。
答案 0 :(得分:7)
这是Java利用来自C和C ++世界的编译器优化。对于32位int
,使用大于或等于31的位移参数将结果值设置为0,表示正int
。 (对于否定参数,C和C ++中的移位行为是实现定义)。
在C和C ++中,对于32位int
实际上使用大于31的值实际上是未定义的行为,Java身体实际上已经明确地定义了行为并且只是执行模数为32的转换(这是大多数C和C ++编译器实际上做的)。您引用的JLS代码段中明确提到了此方法。
提取数字的最低五位相当于将该数字取模32。