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 以外,其他七種基本資料型態的轉換方向如下
char → byte → short → int → long → float → double
切記, boolean 型態的值只有 true 或 false ,而且無法轉換為其他資料型態。
這個轉換方向也可以倒過來,就是儲存範圍大的型態轉換成儲存範圍小的型態,被稱為縮小轉換 (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 |
參考資料
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
http://java.sun.com/docs/books/jls/third_edition/html/conversions.html
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
http://java.sun.com/docs/books/jls/third_edition/html/conversions.html
6 則留言:
本來正確結果是否應為32?
a 轉換成 byte 後變成 64 ,因此 64/10 的結果是 6 喔!
我指得是文中還沒經byte轉換的結果~
漏打 2 ,已修改,感謝指正 :)
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?
請問怎麼算,我初學不太了解。是否可以指點迷津~謝謝
byte 型態只有 8 位元,範圍是從最大正整數 127 到最小負整數 -128 之間的數字。自動型態轉換的縮小轉換是編譯器自己去裁切,基本上是把 short 型態最大正整數 32767 到 -32768 二進位數字裁切成 8 位元,至於裁切(計算)方式,要依編譯器處理後的結果為準唷!
^_^
張貼留言