Java種的基本資料型別轉換(自動、強制、提升)
阿新 • • 發佈:2018-11-23
Java種的8大基本資料型別,以及它們所佔記憶體大小和範圍
1、自動型別轉換
自動型別轉換是指:數字表示範圍小的資料型別可以自動轉換成範圍大的資料型別。
如:
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 等資料型別,而不需要強制轉換,只要該常量值不超過該型別的表示範圍都能自動轉換
char a = 400;
2、強制型別轉換
強制型別轉換我們再清楚不過了,即強制顯示的把一個數據型別轉換為另外一種資料型別。
如:
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 型別表示的範圍,所以會轉換成一個毫無意義的數字44。原因如下:
int 300在記憶體種儲存如下:大端法
轉為byte時,byte只截取了記憶體地址高8位,即byte b在記憶體中儲存為:
轉為十進位制為44.
3、型別提升
所謂型別提升就是指在多種不同資料型別的表示式中,型別會自動向範圍表示大的值的資料型別提升。
把上面的溢位的例子再改下。
long count = 100000000; int price = 1999; long totalPrice = price * count;