數(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
}
}