Java 快速導覽 - 型態轉換

基本資料型態 (primitive data type) 中屬於數字的,如整數類及浮點數類,進行算術運算時若是不同資料型態出現在相同運算式中,便會依提昇規則 (promotion) 進行型態轉換 (conversion) 。例如,以下程式

class PTConversion {
    public static void main(String[] args) {
        byte a = 6;
        short b = 5;
        int c = 4;
        long d = 3;
        float e = 2.5f;
        double f = 1.5;
        
        System.out.println(a / b);
        System.out.println(c / e);
        System.out.println(d / f);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:PTConversion.java
    功能:示範運算式中自動型態轉換
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯後執行,結果如下



第 10 行
System.out.println(a / b);


這是以 byte 型態除以 short ,由於 short 佔用的空間較大,因此型態為 byte 的變數 a 會先轉換成 short ,所以 a / b 最後的結果會是 short 型態的值。


同樣的道理,第 11 行
System.out.println(c / e);


int 型態除以 float ,由於 float 佔用的空間較大,因此型態為 int 的變數 c 會先轉換成 float ,所以 c / e 最後的結果會是 float 型態的值。


第 12 亦同,long 型態除以 double ,所以最後的結果會是 double 型態的值。這樣的轉換方式被稱為放大轉換 (widening conversion) ,這是說儲存範圍小的型態轉換成儲存範圍大的型態,因此原本儲存的資訊並不會流失。


大體而言,除 boolean 以外,其他七種基本資料型態的轉換方向如下
charbyteshortintlongfloatdouble


切記, boolean 型態的值只有 truefalse ,而且無法轉換為其他資料型態。


這個轉換方向也可以倒過來,就是儲存範圍大的型態轉換成儲存範圍小的型態,被稱為縮小轉換 (narrowing conversion) ,如下例子
class PTN {
    public static void main(String[] args) {
        short a = 320;
        byte b = 10;
        System.out.println((byte) a / b);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:PTN.java
    功能:示範運算式中型態轉換
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯後執行,結果如下



這樣的轉換方式利用 cast 運算子 (cast operator) ,也就是利用小括弧圍起資料型態的名稱,然後放在所要轉換型態的變數前面,如上例
System.out.println((byte) a / b);


運算式 (byte) a / b 中, cast 運算子 (byte) 只對變數 a 作用。


縮小轉換會造成資料的流失,因此容易造成資料的不正確性,如上例正確結果應為 32 ,但經過縮小轉換後計算結果為 6 。


中英文術語對照
基本資料型態primitive data type
提昇規則promotion
型態轉換conversion
放大轉換widening conversion
縮小轉換narrowing conversion
cast 運算子cast operator




6 則留言:

badboy99 提到...

本來正確結果是否應為32?

Kaiching Chang 提到...

a 轉換成 byte 後變成 64 ,因此 64/10 的結果是 6 喔!

badboy99 提到...

我指得是文中還沒經byte轉換的結果~

Kaiching Chang 提到...

漏打 2 ,已修改,感謝指正 :)

Unknown 提到...

class PTN {
public static void main(String[] args) {
short a = 320;
byte b = 10;
System.out.println((byte) a / b);
}
}
-------------------------分隔線
請問short a = 320;
轉換成8位元是1440嗎?
1440/10=144

可是你終端機圖片輸出的好像是6?
請問怎麼算,我初學不太了解。是否可以指點迷津~謝謝

Kaiching Chang 提到...

byte 型態只有 8 位元,範圍是從最大正整數 127 到最小負整數 -128 之間的數字。自動型態轉換的縮小轉換是編譯器自己去裁切,基本上是把 short 型態最大正整數 32767 到 -32768 二進位數字裁切成 8 位元,至於裁切(計算)方式,要依編譯器處理後的結果為準唷!

^_^