1、Java數據類型之強制類型轉換:
class DataTypeConversion{
public static void main(String[] args){
int x = 3;
byte b = 4;
b = x + b;
System.out.println(b); //輸出結果報錯,錯誤:可能損失精度
}
}
上面代碼:輸出結果報錯,錯誤:可能損失精度
2、分析原因:
下面是byte b
和int x
的二進制表現形式:
根據上一篇隱式類型轉換可以知道,當我們進行x + b
運算的時候,會默認將小的byte
類型提升爲int
類型和x
進行計算;
下面的計算結果爲int
類型的7
;
最後我們將int
類型的7
賦值給byte
類型的b
,因爲byte
類型是1個字節,所以裝不下四個字節的int
類型的7
,這裏就報錯提示可能損精度。這時我們就用到了強制轉換。
我們可以通過下面的代碼將int
類型的7
強制轉換爲byte
類型的7
,去掉int
類型7
前面三個八位,這樣就實現了強制轉換。
class DataTypeConversion{
public static void main(String[] args){
int x = 3;
byte b = 4;
b = (byte)(x + b);
System.out.println(b); //輸出結果爲byte類型的7
}
}
編譯通過:輸出結果爲byte類型的7
3、強制轉換過程超出範圍:
上面是int類型的7轉換爲byte類型,因爲7在byte的取值範圍(-128 ~ 127)之內,但是如果強制轉換過程中,值超出byte的取值範圍如何處理呢?
class DataTypeConversion{
public static void main(String[] args){
int x = 126;
byte b = 4;
b = (byte)(x + b);
System.out.println(b); //輸出結果爲byte類型的-126
}
}
上面x + b
計算結果爲int類型的130,很明顯超出了byte類型的範圍,結果爲-126,我們通過二進制看下原因:
首先我們拿到130的二進制:00000000 00000000 00000000 10000010
我們在轉換過程中是將前面三個八位砍掉:10000010
因爲計算過程中我們都是通過補碼進行計算,所以我們要求出其原碼
我們已知負數補碼求原碼:減一取反
求得原碼爲:11111110,由此可見該數正好爲-126
4、下面我們在舉一個強制轉換超出範圍的例子:
class DataTypeConversion{
public static void main(String[] args){
byte b = (byte)300;
System.out.println(b); //輸出結果爲byte類型的44
}
}
根據上面的思路:
我們已知int類型300的二進制爲:00000000 00000000 00000001 00101100
轉換爲byte類型將前三個八位去掉:00101100
最高位符號位爲0,爲整數:整數的原反補都一樣,所以該數的原碼就是00101100,即44