我最近注意到了Java中關於Java中基本算術運算的特質。用下面的代碼int上的基本算術運算 - Java
byte a = 3;
byte b = 4;
byte c = a * b;
我得到一個「類型不匹配」編譯錯誤......
在Java(+
,-
,*
,/
)基本的算術運算只對基本數據類型的int
執行和更高階(long
,double
等),而byte
和short
上的算術運算首先被轉換爲int
,然後進行評估?
我最近注意到了Java中關於Java中基本算術運算的特質。用下面的代碼int上的基本算術運算 - Java
byte a = 3;
byte b = 4;
byte c = a * b;
我得到一個「類型不匹配」編譯錯誤......
在Java(+
,-
,*
,/
)基本的算術運算只對基本數據類型的int
執行和更高階(long
,double
等),而byte
和short
上的算術運算首先被轉換爲int
,然後進行評估?
上byte
,char
和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`
BTW這甚至編譯儘管它會導致溢出。 :]
final int a = 300000, b = 400000;
int c = a * b; // compiles but overflows, is not made a `long`
整數運算的結果是int
或long
。這在拼寫出JLS:
4.2.2。整數運算
數值運算符,其導致
int
類型的值或long
:
一元加號和減號符+和 - (§15.15.3,§15.15.4 )
乘法運算符*,/,和%(§15.17)
加法運算符+和 - ( 15.18)
...
Also:
5.6.2。二進制數值提升
當操作者施加的二進制數值提升到一對操作數,其中的每一個必須表示一個值,該值可以轉換爲一個數字類型,適用下列規則,爲了:
加寬原始轉化率(§5.1.2)被施加到的一個或兩個操作數轉換由下面的規則中指定:
如果操作數的類型是雙,其他被轉換爲加倍。
否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。
否則,如果任一操作數的類型爲long,則另一個操作數轉換爲long。
否則,兩個操作數都轉換爲int類型。
...是對某些運營商的操作數進行
二元數值提升:
乘法運算符*,/和%(§15.17)
數字類型+和 - (§15.18.2)的加法和減法運算符
- 個
數值比較運算符<,< =,>,和> =(§15.20.1)
數值相等運算==和!=(§15.21.1)
整數按位運營商&,^和| (§15.22.1)
在某些情況下,條件運算符? :(§15.25)
好問題。我真的不知道答案,但找到了答案。 http://mindprod.com/jgloss/multiplication.html – Zutty