int 的基本算术运算 - Java

Posted

技术标签:

【中文标题】int 的基本算术运算 - Java【英文标题】:Basic arithmetic operations on int - Java 【发布时间】:2012-12-17 01:03:27 【问题描述】:

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

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

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

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

【问题讨论】:

好问题。老实说,我不知道答案,但找到了这个。 mindprod.com/jgloss/multiplication.html 【参考方案1】:

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

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

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

【讨论】:

哎呀,我不知道final 会让这样在这里有所不同。但无论如何它看起来很奇怪,因为即使在第二个示例中,ab 仍然被声明为字节...... 除非编译器可以确定值在范围内 它是一个在范围内的常量表达式。【参考方案2】:

整数运算的结果是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。

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

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

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

...

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

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

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

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

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

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

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

【讨论】:

以上是关于int 的基本算术运算 - Java的主要内容,如果未能解决你的问题,请参考以下文章

Java中的算术运算符

JAVA算术运算符

JAVA算术运算符

JAVA 1.4 算术运算

Java Review (运算符)

Java Review (运算符)