2010年6月19日 星期六

Java 資料型別與運算式 #2



※ 型態轉換

每個變數的資料型態會在我們宣告此變數時定義,但有時一個己定義的資料型態變數要使用,另一個不同資料型態的變數時,這時就需要對資料型態進行轉 換,兩個不同型態的變數資料才能互相使用。在Java 語言中,資料型態的轉換方式可分為,自動資料型態轉換與強制資料型態轉換兩種。當我們將資料長度較小的資料型態轉換至資料長度比較大的資料型態時(如 int(32bit) 轉 long(64bit)),由於並不會造成資料流失的情況,因此當發生此種情況時,Java會自動為我們做資料型態的轉換,例如:


public class BytetoInt {

public static void main(String[] args) {

int intVal;

byte byteVal1=5;

byte byteVal2=10;

intVal=byteVal1+byteVal2;

System.out.println("intVal="+intVal);

//輸出結果為 intVal=15

}

}



在此範例中,由於byte 資料型態比int 資料型態小,所以在運算時Java 會自動將byte
型態轉型成int 資料型態。而自動型態轉換的原則就是將運算式資料型態較的部份全都轉成運
算式中較大的資料型態,以確保在運算過程中不會發生任何的資料遺失。若我們在資料轉型中
指定一個較大的資料型態轉型至較小的資料型態時,由於有可能會造成資料流失的情況(如同
一杯500cc 的水要倒到容量只有100cc 的杯子,必定會流失掉400cc 的水),因此在進行編譯
時Java 會發現存在此種問題存在,並接著產生錯誤訊息,如以下的範例:


public class InttoByte {

public static void main(String[] args) {

byte byteVal; //宣告成byte型態

int intVal=129; //宣告成int型態並給定初始值為129

byteVal=intVal;//byte 指定至 int

System.out.println("byteVal="+byteVal);//印出byteVal的值

}

}



【執行結果】:


雖然編譯器這樣做是為了防止資料轉型時發生資料流失的情況,但若程式中有這類的情況需要轉換時,我們該如何解決呢?答案很簡單就是交給我們自己解決負責,編譯器並不會自動幫我們做這類會造成資料流失的轉型,而是由我們自行在程式碼中註明我們需要轉換的型別,如此一來無論是是否會造成資料流失編譯器都會強制的將該型別轉換成我們註明的型別,當然若發生資料流失的情況,也就得由撰寫程式的人員自行負責囉!我們將上面的範例改成強制轉型方式撰寫如下:


public class InttoByte {

public static void main(String[] args) {

byte byteVal; //宣告成byte型態

int intVal=129; //宣告成int型態並給定初始值為129

byteVal=(byte)intVal;//intVal強制轉型為(byte)並指定給byteVal

System.out.println("byteVal="+byteVal);//印出byteVal的值

//執行結果為 byteVal=-127

}

}



由於byte 最大正數負圍只到127 因此我們將一個值為129 的int 型態變數強制轉型成byte
後將會造成overflow,所以最後輸出的質為-127 並不是129。下圖為一張不同資料資型之間
轉換的圖表,其中char 轉int 為一個特殊的情況,使用者可以直接將整數轉成char 的字元碼。


Java 型態轉換圖



--未完 待續


沒有留言:

張貼留言