
說基本數據類型轉換之前,先了解下 Java 中的 8 種基本數據類型,以及它們的占內存的容量大小和表示的范圍,如下圖所示。

重新溫故了下原始數據類型,現在來解釋下它們之間的轉換關系。
自動類型轉換
自動類型轉換是指:數字表示范圍小的數據類型可以自動轉換成范圍大的數據類型。
如:
long l = 100;
int i = 200;
long ll = i;
具體自動轉換如如下圖所示。

實線表示自動轉換時不會造成數據丟失,虛線則可能會出現數據丟失問題。
自動轉換也要小心數據溢出問題,看下面的例子。
int count = 100000000;
int price = 1999;
long totalPrice = count * price;
編譯沒任何問題,但結果卻輸出的是負數,這是因為兩個 int 相乘得到的結果是 int, 相乘的結果超出了 int 的代表范圍。這種情況,一般把第一個數據轉換成范圍大的數據類型再和其他的數據進行運算。
int count = 100000000;
int price = 1999;
long totalPrice = (long) count * price;
另外,向下轉換時可以直接將 int 常量字面量賦值給 byte、short、char 等數據類型,而不需要強制轉換,只要該常量值不超過該類型的表示范圍都能自動轉換。
強制類型轉換
強制類型轉換我們再清楚不過了,即強制顯示的把一個數據類型轉換為另外一種數據類型。
如:
short s = 199;
int i = s;// 199
double d = 10.24;
long ll = (long) d;// 10
以上的轉換結果都在我們的預期之內,屬於正常的轉換和丟失精度的情況,下面的例子就一樣屬於數據溢出的情況。
int ii = 300;
byte b = (byte)ii;
300 已經超出了 byte 類型表示的范圍,所以會轉換成一個毫無意義的數字。
類型提升
所謂類型提升就是指在多種不同數據類型的表達式中,類型會自動向范圍表示大的值的數據類型提升。
把上面的溢出的例子再改下。
long count = 100000000;
int price = 1999;
long totalPrice = price * count;
price 為 int 型,count 為 long 型,運算結果為 long 型,運算結果正常,沒有出現溢出的情況。
