Java基本數(shù)據(jù)類型轉(zhuǎn)換

Java中的類型轉(zhuǎn)換在Java編碼中具有重要的作用晴氨。首先想暗,來了解下數(shù)據(jù)類型的基本理解:數(shù)據(jù)類型是用來描述數(shù)據(jù)的種類嚷量,包括其值和基于其值基礎(chǔ)上的可進(jìn)行的操作集合镇饮。Java中數(shù)據(jù)類型主要分為兩大類:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。

基本數(shù)據(jù)類型共有8種耗绿,分別是:布爾型boolean, 字符型char和數(shù)值型byte/short/int/long/float/double苹支。由于字符型char所表示的單個(gè)字符與Ascii碼中相應(yīng)整形對(duì)應(yīng),因此误阻,有時(shí)也將其劃分到數(shù)值型中债蜜。引用類型具體可分為:數(shù)組琉用、類和接口。因此策幼,本文中Java類型轉(zhuǎn)換的總結(jié)也將分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩個(gè)方面展開邑时。

一、基本數(shù)據(jù)類型的類型轉(zhuǎn)換

基本數(shù)據(jù)類型中特姐,布爾類型boolean占有一個(gè)字節(jié)晶丘,由于其本身所代碼的特殊含義,boolean類型與其他基本類型不能進(jìn)行類型的轉(zhuǎn)換(既不能進(jìn)行自動(dòng)類型的提升唐含,也不能強(qiáng)制類型轉(zhuǎn)換)浅浮, 否則,將編譯出錯(cuò)捷枯。

1.基本數(shù)據(jù)類型中數(shù)值類型的自動(dòng)類型提升

數(shù)值類型在內(nèi)存中直接存儲(chǔ)其本身的值滚秩,對(duì)于不同的數(shù)值類型,內(nèi)存中會(huì)分配相應(yīng)的大小去存儲(chǔ)淮捆。如:byte類型的變量占用8位郁油,int類型變量占用32位等。相應(yīng)的攀痊,不同的數(shù)值類型會(huì)有與其存儲(chǔ)空間相匹配的取值范圍桐腌。具體如下所示:

圖中依次表示了各數(shù)值類型的字節(jié)數(shù)和相應(yīng)的取值范圍。在Java中苟径,整數(shù)類型(byte/short/int/long)中案站,對(duì)于未聲明數(shù)據(jù)類型的整形,其默認(rèn)類型為int型棘街。在浮點(diǎn)類型(float/double)中蟆盐,對(duì)于未聲明數(shù)據(jù)類型的浮點(diǎn)型,默認(rèn)為double型遭殉。

將一個(gè)int型的3賦給一個(gè)byte型的變量c石挂,居然編譯正確,這是為什么呢恩沽?

原因在于:jvm在編譯過程中誊稚,對(duì)于默認(rèn)為int類型的數(shù)值時(shí)翔始,當(dāng)賦給一個(gè)比int型數(shù)值范圍小的數(shù)值類型變量(在此統(tǒng)一稱為數(shù)值類型k罗心,k可以是byte/char/short類型),會(huì)進(jìn)行判斷城瞎,如果此int型數(shù)值超過數(shù)值類型k渤闷,那么會(huì)直接編譯出錯(cuò)。因?yàn)槟銓⒁粋€(gè)超過了范圍的數(shù)值賦給類型為k的變量脖镀,k裝不下嘛飒箭,你有沒有進(jìn)行強(qiáng)制類型轉(zhuǎn)換,當(dāng)然報(bào)錯(cuò)了。但是如果此int型數(shù)值尚在數(shù)值類型k范圍內(nèi)弦蹂,jvm會(huì)自定進(jìn)行一次隱式類型轉(zhuǎn)換肩碟,將此int型數(shù)值轉(zhuǎn)換成類型k。如圖中的虛線箭頭凸椿。這一點(diǎn)有點(diǎn)特別削祈,需要稍微注意下。

在其他情況下脑漫,當(dāng)將一個(gè)數(shù)值范圍小的類型賦給一個(gè)數(shù)值范圍大的數(shù)值型變量髓抑,jvm在編譯過程中俊將此數(shù)值的類型進(jìn)行了自動(dòng)提升。在數(shù)值類型的自動(dòng)類型提升過程中优幸,數(shù)值精度至少不應(yīng)該降低(整型保持不變吨拍,float->double精度將變高)。

還有一個(gè)地方需要注意的是:char型其本身是unsigned型网杆,同時(shí)具有兩個(gè)字節(jié)羹饰,其數(shù)值范圍是0 ~ 2^16-1,因?yàn)樘既矗@直接導(dǎo)致byte型不能自動(dòng)類型提升到char严里,char和short直接也不會(huì)發(fā)生自動(dòng)類型提升(因?yàn)樨?fù)數(shù)的問題),同時(shí)追城,byte當(dāng)然可以直接提升到short型刹碾。

2.基本數(shù)據(jù)類型中的數(shù)值類型強(qiáng)制轉(zhuǎn)換

當(dāng)我們需要將數(shù)值范圍較大的數(shù)值類型賦給數(shù)值范圍較小的數(shù)值類型變量時(shí),由于此時(shí)可能會(huì)丟失精度(1講到的從int到k型的隱式轉(zhuǎn)換除外)座柱,我們稱之為強(qiáng)制類型轉(zhuǎn)換迷帜。

將一個(gè)值為3的int型變量a賦值給byte型變量b,發(fā)生編譯錯(cuò)誤色洞。這兩種寫法之間有什么區(qū)別呢戏锹?

區(qū)別在于前者3是直接量,編譯期間可以直接進(jìn)行判定火诸,后者a為一變量锦针,需要到運(yùn)行期間才能確定,也就是說置蜀,編譯期間為以防萬一奈搜,當(dāng)然不可能編譯通過了。此時(shí)盯荤,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換馋吗。強(qiáng)制類型轉(zhuǎn)換所帶來的結(jié)果是可能會(huì)丟失精度,如果此數(shù)值尚在范圍較小的類型數(shù)值范圍內(nèi)秋秤,對(duì)于整型變量精度不變宏粤,但如果超出范圍較小的類型數(shù)值范圍內(nèi)脚翘,很可能出現(xiàn)一些意外情況。

如下經(jīng)典例子:

1packagecom.corn.testcast;23publicclassTestCast {45publicstaticvoidmain(String[] args) {6inta = 233;7byteb = (byte) a;8System.out.println("b:" + b);//輸出:-239}1011}

為什么結(jié)果是-23绍哎?需要從最根本的二進(jìn)制存儲(chǔ)考慮来农。

233的二進(jìn)制表示為:24位0 + 11101001,byte型只有8位崇堰,于是從高位開始舍棄备图,截?cái)嗪笫O拢?1101001,由于二進(jìn)制最高位1表示負(fù)數(shù)赶袄,0表示正數(shù)揽涮,其相應(yīng)的負(fù)數(shù)為-23。

3.進(jìn)行數(shù)學(xué)運(yùn)算時(shí)的數(shù)據(jù)類型自動(dòng)提升與可能需要的強(qiáng)制類型轉(zhuǎn)換

1packagecom.corn.testcast;23publicclassTestCast {45publicstaticvoidmain(String[] args) {6bytea = 3 + 5;//編譯正常 編譯成 3+5直接變?yōu)?7intb = 3, c = 5;8byted = b + c;//編譯錯(cuò)誤:cannot convert from int to byte910bytee = 10, f = 11;11byteg = e + f;//編譯錯(cuò)誤 +直接將10和11類型提升為了int12byteh = (byte) (e + f);//編譯正確13}1415}

當(dāng)進(jìn)行數(shù)學(xué)運(yùn)算時(shí)饿肺,數(shù)據(jù)類型會(huì)自動(dòng)發(fā)生提升到運(yùn)算符左右之較大者蒋困,以此類推。當(dāng)將最后的運(yùn)算結(jié)果賦值給指定的數(shù)值類型時(shí)敬辣,可能需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換雪标。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溉跃,隨后出現(xiàn)的幾起案子村刨,更是在濱河造成了極大的恐慌,老刑警劉巖撰茎,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嵌牺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龄糊,警方通過查閱死者的電腦和手機(jī)逆粹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炫惩,“玉大人僻弹,你說我怎么就攤上這事∷拢” “怎么了蹋绽?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)筋蓖。 經(jīng)常有香客問我卸耘,道長(zhǎng),這世上最難降的妖魔是什么扭勉? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任鹊奖,我火速辦了婚禮,結(jié)果婚禮上涂炎,老公的妹妹穿的比我還像新娘忠聚。我一直安慰自己,他們只是感情好唱捣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布两蟀。 她就那樣靜靜地躺著,像睡著了一般震缭。 火紅的嫁衣襯著肌膚如雪赂毯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天拣宰,我揣著相機(jī)與錄音党涕,去河邊找鬼。 笑死巡社,一個(gè)胖子當(dāng)著我的面吹牛膛堤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晌该,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼肥荔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了朝群?” 一聲冷哼從身側(cè)響起燕耿,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姜胖,沒想到半個(gè)月后誉帅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡右莱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年堵第,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隧出。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踏志,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胀瞪,到底是詐尸還是另有隱情针余,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布凄诞,位于F島的核電站圆雁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帆谍。R本人自食惡果不足惜伪朽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汛蝙。 院中可真熱鬧烈涮,春花似錦朴肺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讶舰,卻和暖如春鞍盗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跳昼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工般甲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹅颊。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓敷存,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挪略。 傳聞我的和親對(duì)象是個(gè)殘疾皇子历帚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法杠娱,內(nèi)部類的語法挽牢,繼承相關(guān)的語法,異常的語法摊求,線程的語...
    子非魚_t_閱讀 31,622評(píng)論 18 399
  • Java byte code 的學(xué)習(xí)意義 為啥要學(xué)java bytecode禽拔,這就跟你問我已經(jīng)會(huì)python了為...
    shanggl閱讀 1,662評(píng)論 0 3
  • 第一類:邏輯型boolean 第二類:文本型char 第三類:整數(shù)型(byte、short室叉、int睹栖、long) c...
    Jasonme閱讀 1,074評(píng)論 0 4
  • 年初一,濟(jì)南茧痕,小雪 老話兒不假野来,瑞雪兆豐年 還沒回過神兒來 昨天的陽光已成為去年的陽光 小雪下在年初一,多么讓人歡...
    琴歌素簡(jiǎn)閱讀 518評(píng)論 0 2
  • 季涼言的房間設(shè)計(jì)得很好,陽光剛好可以照進(jìn)來 季涼言摸了摸旁邊果然有人“嵐敬你舍得陪我啦令野!” 回答她的只有沉默...
    暴風(fēng)忙內(nèi)江伊璐閱讀 399評(píng)論 1 2