Java型別轉換
技術標籤:java
圖.基本資料型別級別
一、自動型別轉換
當低等級型別的量需要轉換成高等級型別的量時,會發生自動型別轉換。
在基本資料型別中,byte和char ,char和short之間不能自動轉換
1.整數型別之間的自動型別轉換
以下只列舉一種,其餘類似。
byte→short
//宣告並初始化一個byte型別的變數a
byte a = 12;
//將a賦值給short型別的b
short b = a;
//控制檯輸出b的值
System.out.println(b);
//控制檯內容如下
//12
2.整數型別到浮點型別的自動型別轉換
以下只列舉一種,其餘類似。
int→float
//宣告並初始化一個int型別的變數a
int a = 500;
//將a賦值給float型別的b
float b = a;
//控制檯輸出b的值
System.out.println(b);
//控制檯輸出內容如下
//500.0
3.字元型別到數字型別
字元型別轉換成數字型別,得到的數字是字元編碼表中字元對應的二進位制數轉換成的十進位制數,Java使用的是Unicode字符集。
3.1字元型別到整數型別的自動型別轉換
兩種情況類似,以下只列舉一種。
char→int
//宣告並初始化一個char型別的變數a
char a = 'a';
//將a賦值給int型別的b
int b = a;
//控制檯輸出b的值
System.out.println(b);
//控制檯輸出內容如下
//97
3.2字元型別到浮點型別的自動型別轉換
兩種情況類似,以下只列舉一種。
char→float
//宣告並初始化一個char型別的變數a
char a = 'a';
//將a賦值給float型別的b
float b = a;
//控制檯輸出b的值
System.out.println(b);
//控制檯輸出內容如下
//97.0
二、強制型別轉換
強制的型別轉換可能會造成精度丟失。
計算機只能通過二進位制讀取和儲存資料,所以Java只是用二進位制數來表示十進位制數。你設定的十進位制數在底層實際上是一個二進位制數。強制型別轉換,本質上是一個長的二進位制數的轉換成一個短的二進位制數。這個轉換過程,長的二進位制數通過擷取來變成短的二進位制數。Java用補碼來表示數字,例如十進位制數-128,它的16位補碼是1111111110000000。
1.發生精度丟失
//宣告並初始化一個int型別的變數a
int a = 128;//128的補碼為0000000010000000
//將a賦值給float型別的b
byte b = a;//強制轉換,擷取0000000010000000的後八位,得到10000000
//補碼為10000000的十進位制數是-128;
//控制檯輸出b的值
System.out.println(b);
//控制檯輸出內容如下
//-128
2.未發生精度丟失
當高等級的型別的量的值,在低等級量的值得取值範圍時,擷取的過程不會發生精度丟失。
同一個十進位制數,當這個數在低位整數型別的取值範圍中時,儲存在高位整數型別中的補碼和低位整數型別的補碼,區別如下:
負整數,例如-12存在16位的整數型別中,補碼為1111111111110100,存在8位的整數型別中補碼為11110100,當這個儲存-12的16位整數型別強制轉換成8位整數型別時,擷取後,補碼為11110100,故未發生精度丟失。
整數,例如12存在16位的整數型別中,補碼為0000000000001100,存在8位的整數型別中補碼為00001100,當這個儲存12的16位整數型別強制轉換成8位整數型別時,擷取後,補碼為00001100,故未發生精度丟失。
整數型別之間,其餘類似。
//宣告並初始化一個int型別的變數a
int a = 12;
//將a賦值給byte型別的b
byte b = a;//byte的取值範圍是-128~127,12在其中
//控制檯輸出b的值
System.out.println(b);
//控制檯內容如下
//12
三、表示式中的型別轉換
1.當只有short,byte,char,int型別的量參與運算時,所有量轉換成int型別再運算
//例如
char a = 'a';
byte b = 2;
short c = 3;
System.out.println(a+b+c);
//所有變數轉換成int型別再運算
//控制檯輸出:
//102
2.當參與運算的量有浮點型別的變數參與時,所有量轉換成最高階的型別,再運算
//例如
int a = 100;
byte b = 2;
double c = 3.0;
System.out.println(a+b+c);
//所有變數轉換成double型別再運算
//控制檯輸出:
//105.2