int上的基本算术运算 – Java

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

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

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

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

除非编译器可以确定值在范围内,否则将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` 

整数运算的结果是intlong 。 这在JLS中有详细说明:

4.2.2。 整数运算

数值运算符, 其结果为intlong类型的值

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

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

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

另外 :

5.6.2。 二进制数字促销

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

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

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

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

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

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

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

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

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

  • 数值比较运算符<,<=,>和> =(§15.20.1)

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

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

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