2016-02-17 30 views

回答

1

我懷疑你在說的是promotion。它並不像往常一樣簡單。有關詳細的原始加寬,但這裏Section 5.1.2會談有一些指引:

  • 如果結果分配給一個變量,然後它會被晉升爲變量的類型(如果可能)
  • 比較有限類型將被提升到了更廣闊的類型
  • 一個結果可以,如果它很可能是大於類型將處理

就像我說的,這是實際的規則,簡化獲得提升,但一般Java做正確的事情。

0

Java語言規範(JLS)的以下部分都適用:

5.6節數值促銷)「數值提升施加到算術運算符的操作數」

節5.6.2.2二進制數字推廣)「... ...如果任一操作數的類型是double ... long ... float ...否則兩個操作數都轉換爲int類型」

因此,在你的byte + short的例子中,首先被轉換爲整數。

爲了進一步說明:

short a = 1; 
short b = 2; 
short c = a + b; 

將產生一個編譯錯誤 「需要短,實測值INT」。 你需要投加(一個int)的結果爲短,像這樣:

short c = (short) (a + b); 
0

您需要了解參數的推廣和鑄造概念。 Java只能評估具有相同類型值的表達式。例如,如果你有表達式a = b + c;那麼a和b和c必須具有相同的類型。你現在可能會想知道如何在不出現任何錯誤的情況下添加整數和雙精度。這是類型提升的概念被Java隱式應用的地方。在這種情況下,你的整數變量隱含地改變爲僅用於執行你的操作的double(記住你的整型變量的類型不改變,只爲你的表達式做雙重拷貝)。

現在重點是,只有在變量的數據沒有丟失的情況下,java才隱式使用類型提升。例如,如果將整數更改爲double,則不會丟失任何數據。但如果你想改變讓我們說一個值爲1.2的雙變量爲整數,那麼你將失去小數部分。這是java不會應用類型提升的地方,您需要手動進行類型轉換。基本上什麼類型的轉換意味着要控制編譯器,並告訴編譯器,我知道我可能會在我的變量中丟失一些數據,但沒關係,併爲我執行投射。 類型提升和投射發生在表達式和方法調用中。 下表顯示了java將自動執行的有效促銷活動。

類型             有效促進

雙         無
浮動                 雙
長                 浮點或雙精度
INT                        長,浮動或雙
炭               整型,長整型,浮點或者雙倍勒
短             整型,長整型,浮點或雙(但不是char)
字節               短型,整型,長整型,浮點或雙(但不是char)
布爾值   無(布爾值不被視爲java中的數字)