溫馨提示×

溫馨提示×

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

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

詳解解密Java中的類型轉(zhuǎn)換問題

發(fā)布時(shí)間:2020-09-21 20:12:04 來源:腳本之家 閱讀:126 作者:bddylww 欄目:編程語言

眾所周知Java中的數(shù)據(jù)類型是強(qiáng)數(shù)據(jù)類型,基本數(shù)據(jù)類型之間的轉(zhuǎn)換尤其固定的規(guī)則,當(dāng)數(shù)據(jù)寬度比較窄的數(shù)據(jù)類型(如int)轉(zhuǎn)換成數(shù)據(jù)類型比較寬的數(shù)據(jù)類型時(shí)(如double),則窄的數(shù)據(jù)類型會(huì)加寬,可以完成自動(dòng)類型轉(zhuǎn)換,這稱為隱式轉(zhuǎn)換。

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

intintScore = 96;
doubledoubleScore = intScore;

那么如果試圖把寬的數(shù)據(jù)類型(如double)轉(zhuǎn)換成窄的數(shù)據(jù)類型(如float)時(shí),編譯器會(huì)提示編譯錯(cuò)誤,想要編譯通過,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。那么,此時(shí)的數(shù)據(jù)會(huì)發(fā)生截?cái)?。產(chǎn)生的結(jié)果是:

1. 數(shù)據(jù)正確,只是精度降低了;

2. 數(shù)據(jù)不正確,發(fā)生了溢出;

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

float floatWeight= 63.5; //編譯錯(cuò)誤
double doubleWeight= 63.5;

上述第一條語句會(huì)提示編譯錯(cuò)誤,那是因?yàn)榫幾g器看到63.5時(shí),會(huì)把它當(dāng)做一個(gè)double類型,把一個(gè)double類型賦給float類型,當(dāng)然編譯不通過了。推薦的解決方案是:

float floatWeight = 63.5f;

當(dāng)然,你也可以強(qiáng)制轉(zhuǎn)換成float類型:

float floatWeight = (float)63.5;

其實(shí),上述語句本質(zhì)是把double類型的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換成float類型,發(fā)生了截?cái)?。雖然數(shù)據(jù)的大小沒有變化,但是數(shù)據(jù)的精度卻降低了。

同理:

doubleWeight = floatWeight; //隱式轉(zhuǎn)換
floatWeight = (float)doubleWeight;//強(qiáng)制轉(zhuǎn)換

現(xiàn)在,問題來了,既然是截?cái)?,怎么?huì)產(chǎn)生溢出呢?我們先來看個(gè)例子:

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

以上代碼的輸出結(jié)果是:

b = -106
d = 75

看到結(jié)果,不免會(huì)問為什么b=-106呢?這是因?yàn)閺?qiáng)制轉(zhuǎn)換時(shí)發(fā)生溢出。由于150超出了byte能夠表示的最大范圍(-128 ~ 127)。

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

i = 150,用二進(jìn)制表示i = 0000 0000 1001 0110,short類型占2個(gè)字節(jié),16位,最高位的0表示正數(shù)。當(dāng)把i強(qiáng)制轉(zhuǎn)換成byte類型時(shí),高位發(fā)生截?cái)?,i = 1001 0110。在計(jì)算機(jī)中,用補(bǔ)碼表示,最高位的1表示負(fù)數(shù),那么用原碼表示的話:i = 1110 1010,正好表示十進(jìn)制數(shù)-106。

至此,也就解釋了為什么截?cái)嘁部赡軙?huì)發(fā)生溢出。

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI