詳解解密Java中的類型轉(zhuǎn)換問(wèn)題
眾所周知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)換。
如:以下代碼沒(méi)有任何問(wèn)題,結(jié)果也是正確的,成績(jī)不會(huì)發(fā)生變化,所不同的是成績(jī)的精度提高了。
intintScore = 96; doubledoubleScore = intScore;
那么如果試圖把寬的數(shù)據(jù)類型(如double)轉(zhuǎn)換成窄的數(shù)據(jù)類型(如float)時(shí),編譯器會(huì)提示編譯錯(cuò)誤,想要編譯通過(guò),需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。那么,此時(shí)的數(shù)據(jù)會(huì)發(fā)生截?cái)?。產(chǎn)生的結(jié)果是:
1. 數(shù)據(jù)正確,只是精度降低了;
2. 數(shù)據(jù)不正確,發(fā)生了溢出;
對(duì)于上述第1種情況,比較好理解,我們來(lái)看個(gè)例子:
float floatWeight= 63.5; //編譯錯(cuò)誤 double doubleWeight= 63.5;
上述第一條語(yǔ)句會(huì)提示編譯錯(cuò)誤,那是因?yàn)榫幾g器看到63.5時(shí),會(huì)把它當(dāng)做一個(gè)double類型,把一個(gè)double類型賦給float類型,當(dāng)然編譯不通過(guò)了。推薦的解決方案是:
float floatWeight = 63.5f;
當(dāng)然,你也可以強(qiáng)制轉(zhuǎn)換成float類型:
float floatWeight = (float)63.5;
其實(shí),上述語(yǔ)句本質(zhì)是把double類型的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換成float類型,發(fā)生了截?cái)?。雖然數(shù)據(jù)的大小沒(méi)有變化,但是數(shù)據(jù)的精度卻降低了。
同理:
doubleWeight = floatWeight; //隱式轉(zhuǎn)換 floatWeight = (float)doubleWeight;//強(qiáng)制轉(zhuǎn)換
現(xiàn)在,問(wèn)題來(lái)了,既然是截?cái)?,怎么?huì)產(chǎn)生溢出呢?我們先來(lái)看個(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ì)問(wèn)為什么b=-106呢?這是因?yàn)閺?qiáng)制轉(zhuǎn)換時(shí)發(fā)生溢出。由于150超出了byte能夠表示的最大范圍(-128 ~ 127)。
那么-106又是如何得來(lái)的呢?
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)換問(wèn)題詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- java對(duì)象類型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)
- 詳解Java多態(tài)對(duì)象的類型轉(zhuǎn)換與動(dòng)態(tài)綁定
- Java基礎(chǔ)教程之類型轉(zhuǎn)換與多態(tài)
- java數(shù)據(jù)類型轉(zhuǎn)換陷阱包括列表陷阱
- Java 數(shù)據(jù)類型及類型轉(zhuǎn)換的互相轉(zhuǎn)換實(shí)例代碼
- Java基本數(shù)據(jù)類型與類型轉(zhuǎn)換實(shí)例分析
- Java多態(tài)性抽象類與接口細(xì)致詳解
- Java多態(tài)到底都有啥好處
- java中的多態(tài)和繼承示例分析
- Java 之類型轉(zhuǎn)換與多態(tài)詳情
相關(guān)文章
Java超詳細(xì)講解設(shè)計(jì)模式之一的單例模式
單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式2022-03-03
Java構(gòu)造函數(shù)的相互調(diào)用代碼示例
這篇文章主要介紹了Java構(gòu)造函數(shù)的相互調(diào)用代碼示例,分享了兩段代碼示例,通過(guò)this關(guān)鍵字實(shí)現(xiàn)對(duì)的構(gòu)造函數(shù)的調(diào)用,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
@valid 無(wú)法觸發(fā)BindingResult的解決
這篇文章主要介紹了@valid 無(wú)法觸發(fā)BindingResult的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
關(guān)于java的九個(gè)預(yù)定義Class對(duì)象
這篇文章主要介紹了關(guān)于java的九個(gè)預(yù)定義Class對(duì)象,在Java中,沒(méi)有類就無(wú)法做任何事情。然而,并不是所有的類都具有面向?qū)ο筇卣?。如Math.random,并只需要知道方法名和參數(shù),需要的朋友可以參考下2023-05-05

