移位运算符 - 操作数必须可转换为整数原始类型?

10

我正在为Java考试做准备,阅读的是《OCA Java SE 8程序员学习指南(考试1Z0-808)》。在运算符部分,我发现了这句话:

移位运算符:移位运算符接受两个操作数,其类型必须可以转换为整数原始类型。

这让我感到奇怪,所以我用long类型进行了测试:

public class HelloWorld{

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

     }
}

它运行正常,没有编译器错误,结果也是正确的。这本书有错误吗?还是我误解了书中的引用?


5
JLS将整型定义为“数字类型是byte、short、int、long和char”,对于移位运算符,“如果移位运算符的每个操作数在一元数值提升后的类型不是原始整型类型,则编译时出错。” - Alexis C.
2个回答

11
移位运算符>><<JLS section 15.19中定义。引用如下:
一元数值提升(§5.6.1)分别对每个操作数执行。(不进行二进制数值提升(§5.6.2)。)
如果移位运算符的每个操作数在一元数值提升后的类型不是原始整型类型,则会在编译时出现错误。
当谈到“整数原始类型”时,该书实际上指的是“原始整型类型”(在JLS section 4.2.1中定义)。
整数类型的取值范围如下所示:
  • 对于 byte,从 -128 到 127,包括两端
  • 对于 short,从 -32768 到 32767,包括两端
  • 对于 int,从 -2147483648 到 2147483647,包括两端
  • 对于 long,从 -9223372036854775808 到 9223372036854775807,包括两端
  • 对于 char,从 '\u0000' 到 '\uffff',即从 0 到 65535,包括两端

4

他们使用的是 integer,不是像 Java 中的 int 那样,而是作为“整数类型而不是浮点数或其他类型”来使用。Java 的 long 也是一种整数类型,只不过是一个 64 位宽的整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接