基本數據類型的類型轉換--java

0.緒論html

  java有八大基本數據類型,包括數值型、字符型(char)和布爾型(boolean)。其中,數值型又可分爲整數型(byte、short、int、long)和浮點型(float和double)。關於這八個基本類型的詳細信息,請閱讀java中的8種基本類型,在此再也不贅述。本文主要討論java的8種基本類型之間的類型轉換(下文中的類型轉換都是指基本類型之間的轉換),主要包括如下4個問題:java

  (1)java支持的類型轉換有哪些?其中,有哪些是自動類型轉換,哪些是強制類型轉換?spa

  (2)類型轉換規則?code

  (3)類型轉換過程當中發生的數據溢出和精度損失是什麼緣由致使的?如何判斷?htm

  (3)有哪些類型轉換情形,字面量和算術表達式的類型判斷?blog

1.基本類型之間的類型轉換get

1.1 概述編譯器

  除了boolean型以外,其餘7種基本類型(byte、short、int、long、float、double和char)之間都可以進行類型轉換。boolean型是一個特殊的類型,它只有true和false兩個可能取值。所以,布爾型不能與其餘基本類型作任何轉換。編譯

  類型轉換包括自動類型轉換和強制類型轉換,自動類型轉換是指不須要顯示轉換的類型轉換,即java編譯器默認支持的類型轉換;強制類型轉換是指須要顯示轉換的類型轉換。其中,顯示轉換是指須要用圓括號將目標類型括起來放在源類型變量前面,如(byte)value。其中,value是一個int型變量。class

  java中容許的基本類型之間的自動類型轉換以下所示:

//java中容許的自動類型轉換
//左邊能夠自動轉換成右邊,不支持short和char的自動轉換
byte-->short
byte,short,char-->int-->long-->float-->double

  天然,除了上述的自動類型轉換外,剩下的類型轉換都是強制類型轉換。

1.2 類型轉換規則

  能夠看到,因爲char型可看作是16位無符號整數,所以java的基本類型轉換都是數值類型之間的轉換。在java中,整型和char型變量都是用二進制補碼錶示的,所以在類型轉換時咱們應當從二進制補碼的形式去分析其轉換規則。具體的轉換規則以下:

  (1)若是最初的數值類型是有符號的,那麼就執行符號擴展;若是是char類型,那麼無論它要被轉換成什麼類型,都執行0擴展。

   注:符號擴展用於在數值類型轉換時擴展二進制位的長度,以保證轉換後的數值和原數值的符號(正或負)和大小相同,通常用於較窄的類型(如byte)向較寬的類型(如int)轉換,具體操做方法是在原數值的二進制位左邊補齊若干個與源類型相同的符號位;零擴展則是在原數值的二進制左邊補0。

  (2)若是目標類型的長度小於源類型的長度,則直接截取目標類型的長度。例如將int型轉換成byte型,直接截取int型的右邊8位。
  (3)浮點數轉整型的時候直接捨棄小數部分,若是整數部分比目標類型的長度長的話,按照規則2處理。
1.3 數據溢出和精度損失
  在類型轉換的過程當中可能會發生數據溢出和精度損失,尤爲是強制類型轉換。數據溢出是指因爲源類型的數值不在目標類型所表示的範圍內,致使類型轉換後目標類型數值與源類型數值不相等,精度損失則是指相比於源類型的精度,目標類型的精度要更粗。如下是數據溢出和精度損失的簡單示例:
 1 /*
 2 數據溢出
 3 byte到char,強制類型轉換
 4 */
 5 byte b = -1;//-1的二進制補碼是11111111
 6 char c = (char) b;//byte到char的類型轉換:拿符號位補齊高位,因此c的二進制補碼是1111111111111111,即FFFF。
 7 System.out.println("b:" + b + ",c:" + (int) c);//直接打印char型變量時,打印的是Unicode字符。因此,須要先將char型變量轉換成int型變量
 8  
 9 //輸出結果:b:-1,c:65535
10 
11 /*
12 精度損失
13 long到float,自動類型轉換
14 */
15 long l = 278878996;
16 float f = l;
17 System.out.println("l:" + l + ",f:" + f);
18 
19 //輸出結果:l:278878996,f:2.78879008E8

  問題1:如何判斷類型轉換可能會致使數據溢出?判斷是否會發生數據溢出的關鍵在於判斷目標類型可以表示的取值範圍是否包含源類型的取值範圍,若是源類型的取值範圍是目標類型的取值範圍的子集,那麼就不會發生數據溢出。

  問題2:如何判斷類型轉換可能會致使精度損失?精度損失通常發生在浮點數與整型之間的類型轉換以及double到float的轉換,其產生緣由是浮點數用科學計數法去表示一個數。當把一個較大的整型數據轉換成浮點數時,會根據float或者double的精度去截取整數位數,在這個截取的過程當中可能會發生精度損失。(有一部分低位數據丟失,具體可參見上面的例子)。

 1.4 發生類型轉換的情形

  在java中可能會發生基本類型之間的類型轉換的情形包括:賦值、算術運算和方法調用 。參與類型轉換的通常有變量、字面量和算術表達式,首先咱們須要清楚這三者的類型,以後才能按照1.2的轉換規則進行類型轉換。其中,變量的類型是肯定的,字面量和算術表達式的類型判斷參見1.4.1和1.4.2。

  1.4.1 字面量的類型

  (1)java中,整型字面量的默認類型是int型,浮點數字面量的默認類型是double型。默認類型是指該字面量後沒有後綴縮寫標明其類型,如30、1.04等。若是字面量有後綴縮寫標明類型,則之後綴縮寫爲準。大小寫L表明long型,大小寫F表明float型,大小寫D表明double型,如12L、1.0f、1.0D。

  (2)當整型字面量的值在byte、short、char的表示範圍內時在賦值時是容許自動類型轉換的(注意這個和1.1中提到的不太一致,屬於int->byte、short、char的特殊狀況),超出時則須要強制類型轉換;

  1.4.1 算術運算表達式的類型

  算術運算表達式的最終結果類型肯定規則爲:

  (1)若是表達式中只有int或者int如下的數據(即byte、short、char),那麼byte、short、cha無條件轉換成int,最終獲得的表達式結果是int型;

  (2)若是表達式中有double、float、long型,則最終的表達式結果是最高的基本類型(long<float<double)。

相關文章
相關標籤/搜索