推廣規則是「當操作數的類型不同時,自動二進制數字提升發生在較小的操作數類型被轉換爲較大的值時」。但操作數是相同類型例如,Java推廣?
byte=byte+byte // Compile time error... found int..
那麼,爲什麼會這樣呢?
推廣規則是「當操作數的類型不同時,自動二進制數字提升發生在較小的操作數類型被轉換爲較大的值時」。但操作數是相同類型例如,Java推廣?
byte=byte+byte // Compile time error... found int..
那麼,爲什麼會這樣呢?
byte
沒有+運算符。取而代之的是,兩個操作數都晉級到int,因此你
byte = byte + byte
... becomes (widening to find + operator) ...
byte = int + int
... becomes (result of + operator) ...
byte = int
...然後失敗,因爲沒有隱式轉換從int
到byte
。你需要轉換:
byte a = 1;
byte b = 2;
byte c = (byte) (a + b);
下面是數字推廣實際規則,從section 5.6.2 of the JLS:
當經營者申請的二進制數值提升到一對操作數,每個都必須表示可轉換爲數值類型的值,則按照以下規則按順序使用擴展轉換(第5.1.2節)根據需要轉換操作數:
感謝Jon,這是我的預期。但我必須要問的一件事是,爲什麼字節中沒有+運算符? – i2ijeya 2009-11-02 12:46:02
向您提供了有關自動提升爲'int'的正確答案。
還有一點需要注意 - 複合賦值運算符表現爲隱式類型的情況。例如:
byte b1 = 1;
byte b2 = 2;
b1 = b1 + b2; // compilation fails
b1 += b2; // compilation successful
this SO question從,並且由於+
算術運算器上面的答案,這兩個操作數轉換爲類型int
。
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2; // compile time error
在上面的代碼中,b1
和b2
值將在運行時解決,所以編譯器將解決值之前都轉換爲int
。
但是,如果我們考慮下面的代碼,
final byte b1 = 1;
final byte b2 = 2;
int b3 = b1 + b2; // constant expression, value resolved at compile time
b1
和b2
是最終的變量和值將在編譯時解析所以編譯不會失敗。
我想談論優惠一般
Java可以評估在其中操作數的類型是相同的
僅作爲示例算術表達式,表達式中的含int和雙值,int值將被提升爲用於表達式的double值。
在另一個詞double someVar = 1/2;// someVar = 0
但
double someVar = (double)1/2;// someVar = 0.5
爲什麼
?
cast operator
創建它的操作數"1"
(這就是所謂的explicit conversion
)的temporary
浮點副本promotion
(或隱式轉換)的操作,所以int values
被提升爲double values
使用in
表達式=>整數2被提升到一倍double someVar = 1.0/2.0; // someVar= 0.5
希望這是有益的,哪怕是出了問題的核心
的[爲什麼我不能添加兩個字節,並得到一個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