010_類型提升問題


一、概念部分

  自動類型轉換:容量小的數據類型可以自動轉換為容量大的數據類型。這里的容量指一個類型的表述范圍、如char(-27~27-1  -128~127)

  強制類型轉換:又被稱為造型,用於顯式的轉換一個數值的類型、在有可能丟失信息的情況下進行的轉換是通過造型來完成的,但可能造成精度降低或溢出。

  強制類型轉換需要注意的是:當一種類型強制轉換成另一種類型,而又超出了目標類型的表示范圍,就會被截斷成為一個完全不同的值。如 : char c=(char) -3;

二、轉換概念圖

  

 三、測試類型  

public class TestClassCase {

    public static void main(String[] args) {
        //[√]因為123在byte這個類型的表述范圍(-128~127)所以可以自動類型轉換
        byte a=123;
        //[X]因為300不在byte這個類型的表述范圍(-128~127)所以編譯錯誤
        //byte b=300;
        //[X]因為-3不在char這個類型的表述范圍(0~65535)所以編譯錯誤
        //char c=-3;
        //[√]
        char d='a';
        //[√]
        int e=d;
        //[√]
        long f=123213;
        float g=f;
        //測試強制類型轉換
        int h=-100;
        //因為-100不在char這個類型的表述范圍(0~65535)所以此處強制類型轉換壓制了編譯錯誤、致使程序實際運行時將該-100截斷為一個完全不同的值
        char i=(char)h;
        //類型自動提升問題
        long j=123;
        int k=2;
         //int l=j+k;//(此處報編譯錯誤、因為a+b之后類型自動提升為long類型、將一個long類型賦值給一個int類型時編譯錯誤
         int money = 1000000000;  //10億
        int years = 20;
        /*
         * 返回的是負數、要想結果正確必須將其中一個轉換為long類型、這里不可(long)(money*years)
         * 因為money*years的值已經超出了int型的表述范圍、本身已經溢出了、對一個已經溢出的做強轉沒有任何意義
         * 為了結果正確、我們將money強轉為long類型
         */
        long total = (long)money*years;
        long times = 70L*60*24*365*70;//
        System.out.println("d="+d);
        System.out.println("e="+e);
        System.out.println("g="+g);
        System.out.println("i="+i);//被截斷為一個無意義的值
        System.out.println("total="+total);
    }

}

測試結果:

四、總結

  a)做所有的二元運算符(+-/*%),都會有類型提升的問題!比如  一個int型(+、-、*、/、%)一個long類型、其運行結果會自動提升為(其中最高的類型)long類型

    比如: long a=123; int b=2;     int c=a+b;(此處報編譯錯誤、因為a+b之后類型自動提升為long類型、將一個long類型賦值給一個int類型時編譯錯誤)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM