移位运算符 - 操作数必须可转换为整数基元?

dra*_*fly 9 java bit-shift java-8

我正准备参加Java考试,我正在阅读"OCA Java SE 8程序员学习指南(考试1Z0-808)".在运营商部分,我发现了这句话:

移位运算符:移位运算符采用两个操作数,其类型必须可转换为整数基元.

我觉得很奇怪,所以我用很长时间测试它:

public class HelloWorld{

     public static void main(String []args){
         long test = 3147483647L;
         System.out.println(test << 1);

     }
}
Run Code Online (Sandbox Code Playgroud)

并且它工作,没有编译器错误和结果是正确的.这本书有错误还是我误解了书中的引用?

Tun*_*aki 10

移位运算符>><<定义在JLS部15.19.引用:

对每个操作数分别执行一元数字提升(第5.6.1节).(不对操作数执行二进制数字提升(第5.6.2节).)

如果在一元数字提升之后移位运算符的每个操作数的类型不是基本整数类型,则这是编译时错误.

在谈到"整数原语"时,本书实际上是在谈论"原始整数类型"(在JLS第4.2.1节中定义):

整数类型的值是以下范围内的整数:

  • 对于字节,从-128到127(含)
  • 简而言之,从-32768到32767,包括在内
  • 对于int,从-2147483648到2147483647,包括在内
  • 很长一段时间,从-9223372036854775808到9223372036854775807,包括
  • 对于char,从'\ u0000'到'\ uffff',包括0到65535