簡體   English   中英

Java中short,int,long,double,float之間的強制轉換

[英]casting between short,int,long,double,float in Java

據我了解,當您使用Java中的算術運算(例如double + int)在這些類型中的2個之間進行轉換時,結果將為更大的類型(在此示例中,結果將為double)。 當您對兩種大小相同的類型進行算術運算時會發生什么? int + float和long + double將得到什么? 因為int和float是4個字節,而long和double是8個字節。

這全部由JLS中的二進制數字升級規則指定。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

當運算符將二進制數字提升應用於一對操作數時,每個操作數必須表示一個可轉換為數字類型的值,以下規則適用:

  1. 如果任何操作數是引用類型,則將其進行拆箱轉換(第5.1.8節)。

  2. 擴展原語轉換(第5.1.2節)適用於轉換以下規則指定的一個或兩個操作數:

    • 如果一個操作數的類型為double,則另一個將轉換為double。

    • 否則,如果其中一個操作數的類型為float,則另一個將轉換為float。

    • 否則,如果其中一個操作數的類型為long,則另一個將轉換為long。

    • 否則,兩個操作數都將轉換為int類型。

類型轉換后,如果有的話,將值集轉換(第5.1.13節)應用於每個操作數。

二進制數值提升是對某些運算符的操作數執行的:

  • 乘法運算符*,/和%(第15.17節)

  • 數值類型+和-的加法和減法運算符(第15.18.2節)

  • 數值比較運算符<,<=,>和> =(§15.20.1)

  • 數值相等運算符==和!=(§15.21.1)

  • 整數按位運算符&,^和| (第15.22.1節)

  • 在某些情況下,條件運算符? :(§15.25)

(“值集轉換”是關於浮點表示形式之間的映射。)

int + float將為您提供float (請注意,由於默認情況下使用double因此您必須將結果強制轉換為float )。 long + double將使您double

仍將返回可以容納整個值的"bigger"類型。 在您的特定問題

如果您在int和float之間輸入+,則返回值為float,而long + double返回double,

加法運算符+-的行為在15.18.2中定義 JLS的數字類型加法運算符(+和-) 它聲明首先執行二進制數值提升:

對操作數執行二進制數值提升。

依次5.6.2定義 二進制數值提升 本質上,對於基元:

  • 如果一個操作數的類型為double,則另一個將轉換為double。
  • 否則,如果其中一個操作數的類型為float,則另一個將轉換為float。
  • 否則,如果其中一個操作數的類型為long,則另一個將轉換為long。
  • 否則,兩個操作數都將轉換為int類型。

關於類型轉換,有兩個有趣的常見問題解答,可以在以下網址找到: http : //www.programmersheaven.com/2/FAQ-JAVA-Type-Conversion-Casting

http://myhowto.org/java/60-understanding-the-primitive-numeric-type-conversions-in-java/

在回答相同大小的兩種類型的問題時,返回值是精度最高的類型。

嘗試以下代碼:

public static void main(String[] args) {
    int i=1;
    float f=2.5f;
    long l=10;
    double d=3.74;
    System.out.println(i+f);
    System.out.println(f+i);
    System.out.println(l+d);
    System.out.println(d+l);
}

您將看到結果為3.5和13.74,分別是浮點數和雙精度數(在Netbeans 6.9和Java 1.6中進行了測試)。

這種“促銷”的陷阱是long + float將“擴大”為使用浮點數。

例如

System.out.println(1111111111111111111L + 0.0f);
System.out.println(1111111111111111111L + 0.0);

版畫

1.11111113E18
1.11111111111111117E18

在處理long和float時,您可能不會得到更寬的類型,並且可能會失去比預期更高的精度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM