天天看點

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

對于其他7中數值類型,它們之間都可以進行轉換,但是可能會存在精度損失或者其他一些變化。 

轉換分為自動轉換和強制轉換。對于自動轉換(隐式),無需任何操作,而強制類型轉換需要顯式轉換,即使用轉換操作符(type)。

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

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

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

自動轉換時會發生擴寬 (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)異常。

如果要把大的轉成小的, 或者在short與char之間進行轉換,就必須強制轉換,也被稱作縮小轉換(narrowing conversion)。 

因為必須顯式地使數值更小以适應目标類型。強制轉換采用轉換操作符(type)。嚴格地說,将byte轉為char不屬于縮小轉換,因為從byte到char的過程其實是byte–>int–>char,是以widening和narrowing都有。

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

例如:

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

結果如下: 

1

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

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