是真的,Java將原始類型加法(如字節+短)結果轉換爲整數?Java是否總是將加法結果轉換爲int?
回答
我懷疑你在說的是promotion。它並不像往常一樣簡單。有關詳細的原始加寬,但這裏Section 5.1.2會談有一些指引:
- 如果結果分配給一個變量,然後它會被晉升爲變量的類型(如果可能)
- 比較有限類型將被提升到了更廣闊的類型
- 一個結果可以,如果它很可能是大於類型將處理
就像我說的,這是實際的規則,簡化獲得提升,但一般Java做正確的事情。
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);
您需要了解參數的推廣和鑄造概念。 Java只能評估具有相同類型值的表達式。例如,如果你有表達式a = b + c;那麼a和b和c必須具有相同的類型。你現在可能會想知道如何在不出現任何錯誤的情況下添加整數和雙精度。這是類型提升的概念被Java隱式應用的地方。在這種情況下,你的整數變量隱含地改變爲僅用於執行你的操作的double(記住你的整型變量的類型不改變,只爲你的表達式做雙重拷貝)。
現在重點是,只有在變量的數據沒有丟失的情況下,java才隱式使用類型提升。例如,如果將整數更改爲double,則不會丟失任何數據。但如果你想改變讓我們說一個值爲1.2的雙變量爲整數,那麼你將失去小數部分。這是java不會應用類型提升的地方,您需要手動進行類型轉換。基本上什麼類型的轉換意味着要控制編譯器,並告訴編譯器,我知道我可能會在我的變量中丟失一些數據,但沒關係,併爲我執行投射。 類型提升和投射發生在表達式和方法調用中。 下表顯示了java將自動執行的有效促銷活動。
類型 有效促進
雙 無
浮動 雙
長 浮點或雙精度
INT 長,浮動或雙
炭 整型,長整型,浮點或者雙倍勒
短 整型,長整型,浮點或雙(但不是char)
字節 短型,整型,長整型,浮點或雙(但不是char)
布爾值 無(布爾值不被視爲java中的數字)
- 1. 是否將char *轉換爲int * undefined?
- 2. 將LINQ查詢結果轉換爲int
- 3. 它是否有可能會將int *轉換爲unsigned int *
- 4. 將int轉換爲字節 - Java和Actionscript中的不同結果
- 5. java - 無法將整數轉換爲int
- 6. 將double轉換爲int(java)
- 7. Java將String []轉換爲int []
- 8. java將int轉換爲short
- 9. 將int轉換爲char,然後返回int - 並不總是給出相同的結果
- 10. datamapper是否將SGBD結果轉換爲對象?
- 11. 將short轉換爲char是否合法?
- 12. 是否將int轉換爲一個計爲Autoboxing的字符串?
- 13. 將int轉換爲英寸並將結果顯示爲回顯
- 14. 轉換的MySQL結果爲int(C++)
- 15. java轉換爲int
- 16. 是否有可能將int轉換爲自定義類類型(在java中)?如果是,那麼如何?
- 17. C2440無法將int轉換爲int&
- 18. iOS將NSString轉換爲NSDate總是零
- 19. 如何將maskedtextbox值轉換爲int,如果它是空的?
- 20. 是否有內置的例程將lightuserdata轉換爲int?
- 21. 在Win64下將SOCKET強制轉換爲int是否安全?
- 22. 是否有任何函數在PHP中將long轉換爲int?
- 23. 總是轉換爲對象
- 24. 確定CTLine是否爲換行結果
- 25. 將結果轉換爲值
- 26. 將Iteratee轉換爲結果
- 27. 將[Int?]轉換爲[Int]
- 28. 將int轉換爲int []
- 29. 將IO Int轉換爲Int
- 30. 的Java:問題在轉換的指數值的結果爲int