int上的基本算术运算 - Java

时间:2013-01-02 16:49:55

标签: java arithmetic-expressions

我最近注意到Java在Java中的基本算术运算方面的特殊性。使用以下代码

byte a = 3;
byte b = 4;
byte c = a * b;

我收到“类型不匹配”编译错误...

Java中的基本算术运算(+-*/)是否仅对int及更高阶的原始数据类型执行( longdouble等),而byteshort上的算术运算首先转换为int,然后进行评估?

2 个答案:

答案 0 :(得分:15)

bytecharshort上的操作被扩展为int,除非编译器可以确定该值在范围内。

final byte a = 3, b = 4;
byte c = a * b; // compiles

final byte a = 3, b = 40;
byte c = a * b; // compiles

final int a = 3, b = 4;
byte c = a * b; // compiles !!

但是

byte a = 3, b = 4;
byte c = a * b; // doesn't compile as the result of this will be `int` at runtime.

final byte a = 30, b = 40;
byte c = a * b; // doesn't compile as the value is too large, will be an `int`

BTW即使导致溢出,也会编译。 :

final int a = 300000, b = 400000;
int c = a * b; // compiles but overflows, is not made a `long`

答案 1 :(得分:7)

整数运算的结果是intlong。这在JLS

中有详细说明
  

<强> 4.2.2。整数运算

     

数值运算符,其值为intlong

     
      
  • 一元加减运算符+和 - (§15.15.3,§15.15.4)

  •   
  • 乘法运算符*,/和%(§15.17)

  •   
  • 加法运算符+和 - (§15.18)

  •   
  • ...

  •   

Also

  

<强> 5.6.2。二进制数字促销

     

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:

     

应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:

     
      
  • 如果任一操作数的类型为double,则另一个操作数转换为double。

  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

  •   
  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

  •   
  • 否则,两个操作数都将转换为int类型。

  •   
     

...

     

对某些运算符的操作数执行二进制数字提升:

     
      
  • 乘法运算符*,/和%(§15.17)

  •   
  • 数字类型的加法和减法运算符+和 - (§15.18.2)

  •   
  • 数字比较运算符&lt;,&lt; =,&gt;和&gt; =(§15.20.1)

  •   
  • 数字相等运算符==和!=(§15.21.1)

  •   
  • 整数位运算符&amp;,^和| (§15.22.1)

  •   
  • 在某些情况下,条件运算符? :(§15.25)

  •