2013-01-02 63 views
10

我最近注意到了Java中關於Java中基本算術運算的特質。用下面的代碼int上的基本算術運算 - Java

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

我得到一個「類型不匹配」編譯錯誤......

在Java(+-*/)基本的算術運算只對基本數據類型的int執行和更高階(long,double等),而byteshort上的算術運算首先被轉換爲int,然後進行評估?

+0

好問題。我真的不知道答案,但找到了答案。 http://mindprod.com/jgloss/multiplication.html – Zutty

回答

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` 
+0

哎喲,我不知道'最後'會使這裏有所不同。但它看起來很奇怪,因爲即使在第二個例子中,'a'和'b'仍然被聲明爲字節... – fge

+2

*除非編譯器可以確定值在範圍內* <=>它是一個**常量**在範圍內的表達。 – assylias

7

整數運算的結果是intlong。這在拼寫出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)