java中的精度损失:+与+ =

时间:2013-09-25 14:19:38

标签: java

此Java代码

public class test{
   public static void main(String[] args){
      byte[] a = new byte[1];
      a[0] = 1;
      byte x = 1;
      x = x + a[0];
      System.out.println(x);
  }
}

抛出以下编译错误:

test.java:10: possible loss of precision
found   : int
required: byte
    byte y = x + a[0];
               ^
1 error

是吗?这里发生了什么?所有变量都声明为byte。将1的显式转换为字节没有任何区别。但是,改为

public class test{
   public static void main(String[] args){
      byte[] a = new byte[1];
      a[0] = 1;
      byte x = 1;
      x += a[0];
      System.out.println(x);
  }
}

一切都很好。我正在使用java版本1.6.0_16,build-b01进行编译。我的问题是:这是一个错误还是一个功能?为什么+ =的表现与+?

不同

3 个答案:

答案 0 :(得分:3)

你会发现this很有帮助的答案。

  

E1 op = E2形式的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,但E1仅被评估一次。

注意使用复合赋值运算符时引入的显式强制转换。

答案 1 :(得分:2)

在第一种情况下,结果是int。所以你需要为字节显式地强制转换它。但在第二种情况下,java会自动将值转换为byte。所以不需要铸造,也不例外。

答案 2 :(得分:2)

这是Java语言规范中的一个怪癖的结果。 The default type of an integral expression (such as x + a[0]) is int,当您尝试将结果分配给byte而没有强制转换时,编译器会抱怨。从技术上讲,当然,它是正确的,你可以很容易地溢出byte精度。 Using the += syntax avoids the separate x + a[0] expression and its implicit widening conversion:

  

E1 op= E2形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2)),其中TE1的类型,但E1仅被评估一旦。