1. 程式人生 > >Java千百問_06資料結構(006)_java基本資料型別如何轉換

Java千百問_06資料結構(006)_java基本資料型別如何轉換

1、基本型別如何相互轉換

我們看到,將一種型別的值賦給另一種型別是很常見的。在Java中,boolean型別與所有其他7種類型都不能進行轉換,這一點很明確。
對於其他7中數值型別,它們之間都可以進行轉換,但是可能會存在精度損失或者其他一些變化。
java中8種基本資料型別看這裡:java有哪8種基本資料型別
轉換分為自動轉換強制轉換。對於自動轉換(隱式),無需任何操作,而強制型別轉換需要顯式轉換,即使用轉換操作符(type)。

首先將7種類型按下面順序排列一下:

byte <(short=char)< int < long < float < double

如果從小轉換到大,可以自動完成,而從大到小,必須強制轉換。shortchar兩種相同型別也必須強制轉換。

2、如何自動轉換型別

自動轉換時會發生擴寬 (widening conversion)。因為較大的型別(如int)要儲存較小的型別(如byte),記憶體總是足夠的,不需要強制轉換。
如果將字面值儲存到byte、 short、char、long的時候,也會自動進行型別轉換。
注意區別,此時從int(沒有帶L的整型字面值為int)到byte/short /char也是自動完成的,雖然它們都比int小。在自動型別轉化中,除了以下幾種情況可能會導致精度損失以外,其他的轉換都不能出現精度損失。
1. int –> float
2. long –> float
3. long –> double
4. float –> double without strictfp (無符號double)
除了可能的精度損失外,自動轉換不會出現

任何執行時(run-time)異常。

3、如何強制轉換型別

如果要把大的轉成小的, 或者在short與char之間進行轉換,就必須強制轉換,也被稱作縮小轉換(narrowing conversion)。
因為必須顯式地使數值更小以適應目標型別。強制轉換採用轉換操作符(type)。嚴格地說,將byte轉為char不屬於縮小轉換,因為從byte到char的過程其實是byte–>int–>char,所以widening和narrowing都有。

強制轉換除了可能的精度損失外,還可能使模(overall magnitude)發生變化。強制轉換格式如下:

target-type
val =(target-type) value;

例如:

int a=80;  
byte b;   
b = (byte)a;

但你,如果整數的值超出了byte所能表示的範圍,結果將對byte型別的範圍取餘數。例如:

int a=257;  
byte b;   
b = (byte)a;
System.out.println(b);

結果如下:
1

因為a=257超出了byte的[-128,127]的範圍,所以將257除以byte的範圍(256)取餘數得到:b=1。需要注意的是,當a=200時,此時除了256取餘數應該為-56,而不是200。

將浮點型別賦給整數型別的時候,會發生截尾(truncation)。也就是把小數的部分去掉,只留下整數部分。此時如果整數超出目標類型範圍,一樣將對目標型別的範圍取餘數。