溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解解密Java中的類型轉換問題

發布時間:2020-09-21 20:12:04 來源:腳本之家 閱讀:145 作者:bddylww 欄目:編程語言

眾所周知Java中的數據類型是強數據類型,基本數據類型之間的轉換尤其固定的規則,當數據寬度比較窄的數據類型(如int)轉換成數據類型比較寬的數據類型時(如double),則窄的數據類型會加寬,可以完成自動類型轉換,這稱為隱式轉換。

如:以下代碼沒有任何問題,結果也是正確的,成績不會發生變化,所不同的是成績的精度提高了。

intintScore = 96;
doubledoubleScore = intScore;

那么如果試圖把寬的數據類型(如double)轉換成窄的數據類型(如float)時,編譯器會提示編譯錯誤,想要編譯通過,需要進行強制類型轉換。那么,此時的數據會發生截斷。產生的結果是:

1. 數據正確,只是精度降低了;

2. 數據不正確,發生了溢出;

對于上述第1種情況,比較好理解,我們來看個例子:

float floatWeight= 63.5; //編譯錯誤
double doubleWeight= 63.5;

上述第一條語句會提示編譯錯誤,那是因為編譯器看到63.5時,會把它當做一個double類型,把一個double類型賦給float類型,當然編譯不通過了。推薦的解決方案是:

float floatWeight = 63.5f;

當然,你也可以強制轉換成float類型:

float floatWeight = (float)63.5;

其實,上述語句本質是把double類型的數據強制轉換成float類型,發生了截斷。雖然數據的大小沒有變化,但是數據的精度卻降低了。

同理:

doubleWeight = floatWeight; //隱式轉換
floatWeight = (float)doubleWeight;//強制轉換

現在,問題來了,既然是截斷,怎么會產生溢出呢?我們先來看個例子:

shorti = 150;
shortj = 75;
byteb = (byte) i; 
byted = (byte) j; 
System.out.println("b = " + b);
System.out.println("d = " + d);

以上代碼的輸出結果是:

b = -106
d = 75

看到結果,不免會問為什么b=-106呢?這是因為強制轉換時發生溢出。由于150超出了byte能夠表示的最大范圍(-128 ~ 127)。

那么-106又是如何得來的呢?

i = 150,用二進制表示i = 0000 0000 1001 0110,short類型占2個字節,16位,最高位的0表示正數。當把i強制轉換成byte類型時,高位發生截斷,i = 1001 0110。在計算機中,用補碼表示,最高位的1表示負數,那么用原碼表示的話:i = 1110 1010,正好表示十進制數-106。

至此,也就解釋了為什么截斷也可能會發生溢出。

以上所述是小編給大家介紹的Java中的類型轉換問題詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女