Java中的基本數(shù)據(jù)類型轉(zhuǎn)換(自動、強制、提升)
說基本數(shù)據(jù)類型轉(zhuǎn)換之前,先了解下 Java 中的 8 種基本數(shù)據(jù)類型,以及它們的占內(nèi)存的容量大小和表示的范圍,如下圖所示。
重新溫故了下原始數(shù)據(jù)類型,現(xiàn)在來解釋下它們之間的轉(zhuǎn)換關(guān)系。
自動類型轉(zhuǎn)換
自動類型轉(zhuǎn)換是指:數(shù)字表示范圍小的數(shù)據(jù)類型可以自動轉(zhuǎn)換成范圍大的數(shù)據(jù)類型。
如:
- long l = 100;
- int i = 200;
- long ll = i;
具體自動轉(zhuǎn)換如如下圖所示。
實線表示自動轉(zhuǎn)換時不會造成數(shù)據(jù)丟失,虛線則可能會出現(xiàn)數(shù)據(jù)丟失問題。
自動轉(zhuǎn)換也要小心數(shù)據(jù)溢出問題,看下面的例子。
- int count = 100000000;
- int price = 1999;
- long totalPrice = count *
- price;
編譯沒任何問題,但結(jié)果卻輸出的是負(fù)數(shù),這是因為兩個 int 相乘得到的結(jié)果是 int, 相乘的結(jié)果超出了 int 的代表范圍。這種情況,一般把***個數(shù)據(jù)轉(zhuǎn)換成范圍大的數(shù)據(jù)類型再和其他的數(shù)據(jù)進(jìn)行運算。
- int count = 100000000;
- int price = 1999;
- long totalPrice = (long) count * price;
另外,向下轉(zhuǎn)換時可以直接將 int 常量字面量賦值給 byte、short、char 等數(shù)據(jù)類型,而不需要強制轉(zhuǎn)換,只要該常量值不超過該類型的表示范圍都能自動轉(zhuǎn)換。
強制類型轉(zhuǎn)換
強制類型轉(zhuǎn)換我們再清楚不過了,即強制顯示的把一個數(shù)據(jù)類型轉(zhuǎn)換為另外一種數(shù)據(jù)類型。
如:
- short s = 199;
- int i = s;
- // 199
- double d = 10.24;
- long ll = (long) d;
- // 10
以上的轉(zhuǎn)換結(jié)果都在我們的預(yù)期之內(nèi),屬于正常的轉(zhuǎn)換和丟失精度的情況,下面的例子就一樣屬于數(shù)據(jù)溢出的情況。
- int ii = 300;
- byte b = (byte)ii;
300 已經(jīng)超出了 byte 類型表示的范圍,所以會轉(zhuǎn)換成一個毫無意義的數(shù)字。
類型提升
所謂類型提升就是指在多種不同數(shù)據(jù)類型的表達(dá)式中,類型會自動向范圍表示大的值的數(shù)據(jù)類型提升。
把上面的溢出的例子再改下。
- long count = 100000000;
- int price = 1999;
- long totalPrice = price * count;
price 為 int 型,count 為 long 型,運算結(jié)果為 long 型,運算結(jié)果正常,沒有出現(xiàn)溢出的情況。