12

我最近注意到 Java 的一个关于 Java 中基本算术运算的特质。使用以下代码

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

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

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

4

2 回答 2

16

除非编译器可以确定值在范围内,否则对bytechar的操作short将扩大到。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`

顺便说一句,即使它导致溢出,它也会编译。:]

final int a = 300000, b = 400000;
int c = a * b; // compiles but overflows, is not made a `long`
于 2013-01-02T16:53:44.060 回答
7

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

4.2.2. 整数运算

数值运算符,产生一个intorlong类型的值:

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

  • 乘法运算符 *、/ 和 %(第 15.17 节)

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

  • ...

还有

5.6.2. 二进制数字提升

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

加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

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

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

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

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

...

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

  • 乘法运算符 *、/ 和 %(第 15.17 节)

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

  • 数值比较运算符 <、<=、> 和 >=(第 15.20.1 节)

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

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

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

于 2013-01-02T16:53:42.747 回答