Java 數據類型的轉換【強制轉換】

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 bint 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章