一、自動類型轉換
當把一個表數範圍小的數值或變量直接賦給另一個表數範圍大的變量時,系統將可以進行自動類型轉換;否則就需要強制轉換。
如圖所示:
int a = 6;
float b = a; //int型自動轉換爲float型
二、強制類型轉換
強制類型轉換時注意溢出的情況,即縮小轉換。
(1)
int a = 10;
byte b = (byte)a;
(2)
double c = 3.89;
int d = (int)c; //結果是3
把一個浮點數強制類型轉換時,java將直接截斷浮點數的小數部分。
(3)
下面看溢出的情況:
class ForceConvert
{
public static void main(String[] args){
int a = 233;
byte b = (byte) a;
System.out.println(a); // -23
}
}
byte b = (byte) a; 此處會溢出
分析:
整數默認是int類型,那麼233應該是佔四個字節,表示爲 32位
0000 0000 0000 0000 0000 0000 0000 11101001
強制轉換爲byte(8位)會截取數據 ,剩下最後一個字節 11101001,而此數據還是補碼錶示,我們把它轉換爲原碼,最前一位爲符號位。
補碼 11101001 減一求得反碼
反碼 11101000 取反求得原碼
原碼 10010111 轉換爲十進制 -23
(4)下面這比較容易出錯:
float a = 4.6; //直接把4.6賦值float類型變量將出現錯誤,因爲4.6默認是double型。
應該爲: float a = (float )4.6;
(5)靜態方法parseXxx(String str)用於將字符串轉換成基本類型。
通常情況下字符串不能直接轉換爲基本類型,但通過基本類型對應的包裝類則可以把字符串轉換成基本類型:
String a = "12";
int b = Integer.parseInt(a);
包裝類:Boolean、Byte、Short、Integer、Long、Character、Float、Double
三、表達式類型的自動提升
當一個表達式包含多個基本類型的值時,整個算數表達式的數據類型自動提升到與表達式中最高等級操作數同樣的類型。
兩個規則:
1、所有的byte、short、char類型將被提升到int類型;
2、整個算數表達式的數據類型自動提升到與表達式中最高等級操作數同樣的類型。
(1)
short a = 1;
//表達式中的a將自動提升到int類型,則右邊的表達式類型爲int
//將一個int類型值賦給short類型變量將發生錯誤
a = a-2; //a-2爲int類型
(2)
當兩個整數進行除法運算時,如果不能整除,得到的結果將是把小數部分截斷取整數部分。
int a = 33/2; //爲16