【问题标题】:Shift operators - operands must be convertible to an integer primitive?移位运算符 - 操作数必须可转换为整数原语?
【发布时间】:2015-09-28 10:50:56
【问题描述】:

我正在准备参加 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);

     }
}

它成功了,没有编译器错误并且结果是正确的。这本书有错误还是我误解了书中的引述?

【问题讨论】:

  • JLS 定义整数类型为"数值类型为整数类型byte、short、int、long、char,..." 并且对于移位运算符“如果移位运算符的每个操作数的类型在一元数值提升后不是原始整数类型,则为编译时错误。”

标签: java java-8 bit-shift


【解决方案1】:

移位运算符&gt;&gt;&lt;&lt;JLS section 15.19 中定义。引用:

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

如果移位运算符的每个操作数的类型在一元数值提升后不是原始整数类型,则会出现编译时错误

在说“整数基元”的时候,这本书真的是在说“基元整数类型”(定义在JLS section 4.2.1):

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

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

【讨论】:

    【解决方案2】:

    他们使用integer 不是Java int 时尚,而是作为“整数类型而不是浮点或其他类型”。 Java 的long 也是一个整数,它只是一个 64 位宽的整数。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      相关资源
      最近更新 更多