數據類型的轉換是在所賦值的數值類型和被變量接收的數據類型不一致時發生的,它需要從一種數據類型轉換成另一種數據類型。數據類型的轉換可以分為隱式轉換(自動類型轉換)和顯式轉換(強制類型轉換)兩種。
隱式轉換(自動類型轉換)
如果以下 2 個條件都滿足,那么將一種類型的數據賦給另外一種類型變量的時,將執行自動類型轉換(automatic type conversion)。
- 兩種數據類型彼此兼容
- 目標類型的取值范圍大於源數據類型(低級類型數據轉換成高級類型數據)
當以上 2 個條件都滿足時,拓寬轉換(widening conversion)發生。例如 byte 類型向 short 類型轉換時,由於 short 類型的取值范圍較大,會自動將 byte 轉換為 short 類型。
在運算過程中,由於不同的數據類型會轉換成同一種數據類型,所以整型、浮點型以及字符型都可以參與混合運算。自動轉換的規則是從低級類型數據轉換成高級類型數據。轉換規則如下:
- 數值型數據的轉換:byte→short→int→long→float→double。
- 字符型轉換為整型:char→int。
以上數據類型的轉換遵循從左到右的轉換順序,最終轉換成表達式中表示范圍最大的變量的數據類型。
例 1
顧客到超市購物,購買牙膏 2 盒,面巾紙 4 盒。其中牙膏的價格是 10.9 元,面巾紙的價格是 5.8 元,求商品總價格。實現代碼如下:
public static void main(String[] args) { float price1 = 10.9f; // 定義牙膏的價格 double price2 = 5.8; // 定義面巾紙的價格 int num1 = 2; // 定義牙膏的數量 int num2 = 4; // 定義面巾紙的數量 double res = price1 * num1 + price2 * num2; // 計算總價 System.out.println("一共付給收銀員" + res + "元"); // 輸出總價 }
上述代碼中首先定義了一個 float 類型的變量存儲牙膏的價格,然后定義了一個 double 類型的變量存儲面巾紙的價格,再定義兩個 int 類型的變量存儲物品的數量,最后進行了乘運算以及和運算之后,將結果儲存在一個 double 類型的變量中進行輸出。
程序執行結果如下圖 1 所示:
從執行結果看出,float、int 和 double 三種數據類型參與運算,最后輸出的結果為 double 類型的數據。這種轉換一般稱為“表達式中類型的自動提升”。
自動類型提升有好處,但它也會引起令人疑惑的編譯錯誤。例如,下面看起來正確的程序卻會引起問題:
byte b = 50; b = b * 2; // Type mismatch: cannot convert from int to byte
如上所示,第二行會報“類型不匹配:無法從int轉換為byte”錯誤。
該程序試圖將一個完全合法的 byte 型的值 50*2 再存儲給一個 byte 型的變量。但是當表達式求值的時候,操作數被自動的提升為 int 型,計算結果也被提升為 int 型。這樣表達式的結果現在是 int 型,不強制轉換它就不能被賦為 byte 型。確實如此,在這個特別的情況下,被賦的值將仍然適合目標類型。
所以應該使用一個顯示的強制類型轉換,例如:
byte b = 50; b = (byte)(b*2);
這樣就能產生正確的值 100。
注意:char 類型比較特殊,char 自動轉換成 int、long、float 和 double,但 byte 和 short 不能自動轉換為 char,而且 char 也不能自動轉換為 byte 或 short。
顯式轉換(強制類型轉換)
盡管自動類型轉換是很有幫助的,但並不能滿足所有的編程需要。例如,如果你需要將 double 型的值賦給一個 int 型的變量,你將怎么辦?
這種轉換不會自動進行,因為 double 型的變化范圍比 int 型的要小。這種轉換有使成為“縮小轉換”,因為你肯定要將源數據類型的值變小才能適合目標數據類型。
所以當兩種數據類型不兼容,或目標類型的取值范圍小於源類型時,自動轉換將無法進行,這時就需要進行強制類型轉換。其語法格式如下:
(type)variableName
其中,type 為 variableName 要轉換成的數據類型,而 variableName 是指要進行類型轉換的變量名稱,強制轉換的實例如下:
int a = 3; double b = 5.0; a = (int)b;
上述代碼中首先將 double 類型變量 b 的值強制轉換成 int 類型,然后將值賦給 a,但是變量 b 本身的值是沒有發生變化的。
在強制類型轉換中,如果是將浮點類型的值轉換為整數,直接去掉小數點后邊的所有數字;而如果是整數類型強制轉換為浮點類型時,將在小數點后面補零。
例 2
顧客到超市購物,購買牙膏 2 盒,面巾紙 4 盒。其中牙膏的價格是 10.9 元,面巾紙的價格是 5.8 元,求商品總價格,在計算總價時采用 int 類型的數據進行存儲。實現代碼如下:
public static void main(String[] args) { float price1 = 10.9f; double price2 = 5.8; int num1 = 2; int num2 = 4; int res2 = (int) (price1 * num1 + price2 * num2); System.out.println("一共付給收銀員" + res2 + "元"); }
在上述實例中,有 double 類型、float 類型和 int 類型的數據參與運算,其運算結果默認為 double 類型,題目要求的結果為 int 類型,因為 int 類型的取值范圍要小於 double 類型的取值范圍,所以需要進行強制類型轉換。
程序執行結果如下圖 2 所示:
原文:http://c.biancheng.net/view/796.html