2009-11-02 90 views
16

推廣規則是「當操作數的類型不同時,自動二進制數字提升發生在較小的操作數類型被轉換爲較大的值時」。但操作數是相同類型例如,Java推廣?

byte=byte+byte // Compile time error... found int.. 

那麼,爲什麼會這樣呢?

+0

的[爲什麼我不能添加兩個字節,並得到一個int和我能可能的複製添加兩個最終字節得到一個字節?](http://stackoverflow.com/questions/13100019/why-can-not-i-add-two-bytes-and-get-an-int-and-i-can- add-two-final-bytes-get-ab) – 2017-02-07 16:10:51

回答

35

byte沒有+運算符。取而代之的是,兩個操作數都晉級到int,因此你

byte = byte + byte 
... becomes (widening to find + operator) ... 
byte = int + int 
... becomes (result of + operator) ... 
byte = int 

...然後失敗,因爲沒有隱式轉換從intbyte。你需要轉換:

byte a = 1; 
byte b = 2; 

byte c = (byte) (a + b); 

下面是數字推廣實際規則,從section 5.6.2 of the JLS


當經營者申請的二進制數值提升到一對操作數,每個都必須表示可轉換爲數值類型的值,則按照以下規則按順序使用擴展轉換(第5.1.2節)根據需要轉換操作數:

  • 如果任何操作數是引用類型,則執行拆箱轉換(第5.1.8節)。然後:
  • 如果任一操作數的類型爲double,則另一個操作數轉換爲double。
  • 否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。
  • 否則,如果任一操作數的類型爲long,則另一個操作數轉換爲long。
  • 否則,兩個操作數都轉換爲int類型。
+4

感謝Jon,這是我的預期。但我必須要問的一件事是,爲什麼字節中沒有+運算符? – i2ijeya 2009-11-02 12:46:02

14

向您提供了有關自動提升爲'int'的正確答案。

還有一點需要注意 - 複合賦值運算符表現爲隱式類型的情況。例如:

byte b1 = 1; 
byte b2 = 2; 
b1 = b1 + b2; // compilation fails 
b1 += b2; // compilation successful 
0

this SO question從,並且由於+算術運算器上面的答案,這兩個操作數轉換爲類型int

byte b1 = 1; 
byte b2 = 2; 
byte b3 = b1 + b2; // compile time error 

在上面的代碼中,b1b2值將在運行時解決,所以編譯器將解決值之前都轉換爲int

但是,如果我們考慮下面的代碼,

final byte b1 = 1; 
final byte b2 = 2; 
int b3 = b1 + b2; // constant expression, value resolved at compile time 

b1b2是最終的變量和值將在編譯時解析所以編譯不會失敗。

0

我想談論優惠一般

Java可以評估在其中操作數的類型是相同的

僅作爲示例算術表達式,表達式中的含int和雙值,int值將被提升爲用於表達式的double值。

在另一個詞

double someVar = 1/2;// someVar = 0 

double someVar = (double)1/2;// someVar = 0.5 

爲什麼

  • 我們使用(雙)cast operator創建它的操作數"1"(這就是所謂的explicit conversion)的temporary 浮點副本
  • 計算現在由一個浮點值(臨時雙副本1)通過根據上面的語句整數2
  • 劃分,爪哇執行稱爲promotion(或隱式轉換)的操作,所以int values被提升爲double values使用in表達式=>整數2被提升到一倍
  • 的表情變得double someVar = 1.0/2.0; // someVar= 0.5

希望這是有益的,哪怕是出了問題的核心