Day08——強制轉換

1hahahahahahahaha發表於2024-10-02

型別轉換

由於 Java 是強型別語言,所以要進行有些運算的時候,需要用到型別轉換。

型別的優先順序

低----------------------------------------------------------->高

byte,short,char->int->long->float->double

運算中,不同型別的資料先轉化為同一型別,然後進行運算。

 //記憶體溢位
        int i1= 128;
        byte i2=(byte)i1;      //記憶體溢位——byte型別取值範圍是 -128 到 127,超出範圍
        //強制轉換    (型別)變數名!!!!!    高--->低
        //自動轉換                          低--->高
        System.out.println(i1);  //i1=128
        System.out.println(i2);  //i2=-128
        System.out.println("====================================");
        int i3=10;
        double i4=i3;
        System.out.println(i3);
        System.out.println(i4);
        System.out.println("====================================");
        //轉換時,浮點數的精度問題
        System.out.println((int)23.7);          //23
        System.out.println((int)-45.89f);       //-45

        /*
        型別轉換的注意事項
        1.不能對布林值轉換
        2.不能把資料型別轉換為不相干的型別
        3.優先順序高轉換為低的時候,強制轉換
        4.在轉換過程中,可能存在精度問題或者資料溢位問題
         */
        System.out.println("====================================");
        char i5='a';
        int i6=i5+1;
        System.out.println((int)i5);       //97
        System.out.println(i6);            //98
        System.out.println((char) i6);     //b

型別轉換的注意事項

​ 1.不能對布林值轉換
​ 2.不能把資料型別轉換為不相干的型別
​ 3.優先順序高轉換為低的時候,強制轉換
​ 4.在轉換過程中,可能存在精度問題或者資料溢位問題

強制型別轉換

自動型別轉換。

較大的數字計算

//在打出較大數字時,可以用下劃線分隔開,下劃線不會輸出
        int i1=10_0000_0000;         //十億    每四位數有一個下劃線分隔開
        System.out.println(i1);
        System.out.println("========================================");
        //計算問題:每年賺10億,20年一共賺多少?
        int money=10_0000_0000;
        int years=20;

        int total=money*years;
        System.out.println(total);//-1474836480
        long total2=money*years;  //轉換為範圍更大的long。
        // 但money*years計算結果已經預設是int型別了,然後再轉換為long型別,就有問題了
        System.out.println(total2);//-1474836480
        long total3=money*(long)years;
        System.out.println(total3); //200_0000_0000---------正確計算,先把一個數轉換為long型別
        //在 Java 中,當一個 `long` 型別與一個 `int` 型別相乘時,結果為 `long` 型別。
        
        //這是因為在 Java 的運算中,如果參與運算的資料型別不同,會自動進行型別提升,以確保計算的準確性和避免資料丟失。
        // 由於 `long` 型別的取值範圍大於 `int` 型別,所以計算結果會被提升為 `long` 型別。

注意點:

  1. 在打出較大數字時,可以用下劃線分隔開,下劃線不會輸出。每四位數有一個下劃線分隔開。如:10_0000_0000

  2. long型別與int型別相乘,結果是long型別。

    因為在 Java 的運算中,如果參與運算的資料型別不同,會自動進行型別提升,以確保計算的準確性和避免資料丟失。由於 long 型別的取值範圍大於 int 型別,所以計算結果會被提升為 long 型別

    表述範圍小的可以自動轉換為表述範圍大的

    在 Java 中,不同型別的數字進行加減乘除運算時,結果的型別遵循以下規則:
    
    **一、加法(+)**
    
    1. 如果兩個運算元中有一個是 `long` 型別,那麼結果為 `long` 型別。
       - 例如:`int a = 10; long b = 20; long result = a + b;`,結果 `result` 是 `long` 型別。
    2. 如果兩個運算元中有一個是 `double` 型別,那麼結果為 `double` 型別。
       - 例如:`int a = 10; double b = 20.5; double result = a + b;`,結果 `result` 是 `double` 型別。
    3. 否則,如果兩個運算元都是 `int`、`short`、`byte`、`char` 型別,結果為 `int` 型別。
       - 例如:`short a = 10; short b = 20; int result = a + b;`,結果 `result` 是 `int` 型別。
    
    **二、減法(-)**
    
    與加法類似:
    
    1. 如果兩個運算元中有一個是 `long` 型別,那麼結果為 `long` 型別。
    2. 如果兩個運算元中有一個是 `double` 型別,那麼結果為 `double` 型別。
    3. 否則,如果兩個運算元都是 `int`、`short`、`byte`、`char` 型別,結果為 `int` 型別。
    
    **三、乘法(*)**
    
    1. 如果兩個運算元中有一個是 `long` 型別,那麼結果為 `long` 型別。
    2. 如果兩個運算元中有一個是 `double` 型別,那麼結果為 `double` 型別。
    3. 否則,如果兩個運算元都是 `int`、`short`、`byte`、`char` 型別,結果為 `int` 型別。
    
    **四、除法(/)**
    
    1. 如果兩個運算元中有一個是 `double` 型別,那麼結果為 `double` 型別。
       - 例如:`int a = 10; double b = 20.5; double result = a / b;`,結果 `result` 是 `double` 型別。
    2. 如果兩個運算元都是 `int`、`long`、`short`、`byte`、`char` 型別:
       - 對於整數除法,結果為整數型別,即如果兩個運算元都是 `int`,結果為 `int`;如果兩個運算元中有一個是 `long`,結果為 `long`。
       - 例如:`int a = 10; int b = 3; int result = a / b;`,結果 `result` 是 `int` 型別,值為 3。`long c = 10L; long d = 3L; long result2 = c / d;`,結果 `result2` 是 `long` 型別。
    
    需要注意的是,整數除法可能會導致精度丟失,因為它會截斷小數部分。如果需要精確的除法結果,可以將運算元之一轉換為 `double` 型別進行計算。
    
    表述範圍小的可以自動轉換為表述範圍大的
    
 自我測評
 1.將int型別的128轉換為byte型別
 2.將char型別的‘a’轉換為int型別
 3.計算10億乘20的準確結果

相關文章