java語言基礎(chǔ)5--基本數(shù)據(jù)類型轉(zhuǎn)換

數(shù)據(jù)過大和溢出

當(dāng)要表示的數(shù)據(jù)超出數(shù)據(jù)類型的臨界范圍時,稱為溢出。
溢出情況發(fā)生時程序并沒有做數(shù)據(jù)范圍檢查處理,此時會出現(xiàn)數(shù)據(jù)紊亂情況。

public class OverflowDemo {
    public static void main(String[] args) {
        //當(dāng)要表示的數(shù)據(jù)超出數(shù)據(jù)類型的臨界范圍時,稱為溢出
        //int類型的最大值:0x7fffffff ,因為int是32位的,最高位是符號位,0表示正數(shù)
        int intMax = 0x7fffffff;
        intMax = intMax + 1;//編譯只檢查語法,不報錯
        System.out.println(intMax);//-2147483648
        int intMin = 0x80000000;
        intMin = intMin - 1;
        System.out.println(intMin);//2147483647
        }
}
數(shù)據(jù)過大和溢出分析.png

自動類型轉(zhuǎn)換,也稱為“隱式類型轉(zhuǎn)換:

當(dāng)把小數(shù)據(jù)范圍類型的數(shù)值或變量賦給另一個大數(shù)據(jù)范圍類型變量,系統(tǒng)可以完成自動類型轉(zhuǎn)型.
注意:boolean 類型是不可以轉(zhuǎn)換為其他數(shù)據(jù)類型。

自動類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換).png

強制類型轉(zhuǎn)換,也稱為“顯示類型轉(zhuǎn)換:

當(dāng)把大范圍類型的數(shù)值或變量賦給另一個小范圍類型變量時,此時系統(tǒng)不能自動完成轉(zhuǎn)換,需要加上強制轉(zhuǎn)換符,但這樣的操作可能造成數(shù)據(jù)精度的降低或溢出,所以使用時要格外注意。

//類型轉(zhuǎn)換演示
public class TypeConversionDemo {
    public static void main(String[] args) {
        //自動類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換):小轉(zhuǎn)大
        byte b = 1;
        int a = b;
        System.out.println(a);//1
        //強制類型轉(zhuǎn)換 : 大轉(zhuǎn)小,可能會造成數(shù)據(jù)丟失
        double d = 3.14;
        //強制類型轉(zhuǎn)換通過截斷小數(shù)部分將浮點數(shù)轉(zhuǎn)換為整型
        int i = (int) d;
        System.out.println(i);//3
        //如果將一種類型數(shù)值強轉(zhuǎn)為另一種類型,而又超過了目標類型表示的范圍,就會產(chǎn)生完全不同數(shù)值
        byte c = (byte) 300;
        System.out.println(c);//44
        /*結(jié)果分析:
         300 = 0b 0000_0000_0000_0000_0000_0001_0010_1100 ; 32位的int類型
         而byte類型占1個字節(jié),8位,使用取后8位,得到 c =0b0010_1100 = 44; 
         */
    }
}

表達式類型的自動提升

當(dāng)一個算術(shù)表達式中包含多個基本數(shù)據(jù)類型(boolean除外)的值時,整個算術(shù)表達式的數(shù)據(jù)類型將在數(shù)據(jù)運算時出現(xiàn)類型自動提升.
類型自動提升規(guī)則:所有的byte、short、char類型被自動提升到int類型,
整個表達式的最終結(jié)果類型被提升到表達式中類型最高的類型

//表達式類型自動提升,,符合自動類型提升的規(guī)則
public class AutoDemo {
    public static void main(String[] args) {
        //表達式的類型會自動提升,其規(guī)則是: byte,short,char自動提升為int類型
        //整個表達式的最終結(jié)果類型被提升到表達式中類型最高的類型
        double d = 1 + 'A' + 3.14F;
        System.out.println(d);//69.13999938964844
        System.out.println('a' + 1);//98
        byte b = 22;
        //b = b + 11;//編譯出錯,此時結(jié)果類型應(yīng)該是int
    }
}

為什么byte c = 5這是符合強轉(zhuǎn)類型轉(zhuǎn)換條件的,可為什么沒轉(zhuǎn)呢?
因為byte類型占1個字節(jié),所表示的范圍是[-128,127],編譯器發(fā)現(xiàn),5在這個范圍之內(nèi),所以底層默默的進行了轉(zhuǎn)化.

//byte類型的注意點
public class IntToByteDemo {
    public static void main(String[] args) {
        byte b1 = 12;
        /*
         編譯通過.但是,默認情況下,一個整型的字面量默認是int類型.所以12其實是int類型
        但是,編譯器發(fā)現(xiàn),12符合byte類型的范圍,所有底層默默的轉(zhuǎn)換了
        --------------------------------------------------
        byte b2 = 128;編譯報錯 Type mismatch: cannot convert from int to byte
        128超出了byte的范圍,此時需要強轉(zhuǎn)
        */
        byte b2 = (byte) 250;
        /*128 = 0b1111_1010;byte最大值為0b0111_1111 = 127
         把最高位1,看做符號位,所以0b1111_1010是一個負數(shù)的補碼,求該負數(shù), 取反(但符號位除外),+1
         得0b1000_0110 = -6
         */
        System.out.println(b1);//12
        System.out.println(b2);//-6
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容