Java中,long型是64位的儡率,float型是32位的侯繁。為什么long型可以自動(dòng)轉(zhuǎn)float型呢?
這里就涉及到浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)問(wèn)題了胖喳。對(duì)于byte,short贮竟,int丽焊,long四個(gè)整數(shù)類型而言,它們?cè)趦?nèi)存中無(wú)一例外都是直接換算成二進(jìn)制存儲(chǔ)的咕别,所以我們可以直接計(jì)算出它們的最大值技健。二進(jìn)制的第一位是符號(hào)位不計(jì)算入數(shù)值,拿byte來(lái)說(shuō)惰拱,數(shù)據(jù)存儲(chǔ)形式就是0000-0000雌贱,一個(gè)字節(jié)占八位,除去第一位符號(hào)位外,后邊全為1的話就是0111-1111欣孤,換算成十進(jìn)制答案是127.
至于為什么最小的數(shù)是-128呢馋没,這又有講究了。計(jì)算機(jī)中負(fù)數(shù)是以補(bǔ)碼形式存儲(chǔ)的导街,一般說(shuō)來(lái)披泪,八位以內(nèi)最小的負(fù)數(shù)應(yīng)該是11111-1111,我們對(duì)其取反搬瑰,結(jié)果就是1000-0000款票,再得到補(bǔ)碼即1000-0001。是的泽论,0001艾少,補(bǔ)碼是原碼除符號(hào)位外逐位取反再加一的結(jié)果,但是對(duì)于補(bǔ)碼而言1000-0001并不是八位二進(jìn)制能表示的最小的數(shù)翼悴,最小的應(yīng)該是1000-0000缚够,對(duì)1000-0000求原碼,就得到了1001-0000-0000鹦赎,即我們十進(jìn)制數(shù)的-128谍椅。同樣的,對(duì)于short等其它整數(shù)類型也一樣古话。
那么雏吭,float類型呢?4個(gè)字節(jié)陪踩,32位杖们,第1位是符號(hào)位(數(shù)符),即S肩狂,接下來(lái)的8位是指數(shù)域(階碼)摘完,即E,最后的23位傻谁,是小數(shù)域(尾數(shù))孝治,即M。對(duì)于一個(gè)十進(jìn)制數(shù)112.5审磁,我們用科學(xué)計(jì)數(shù)法表示就是1.12510^2谈飒,所以呢,對(duì)于一個(gè)二進(jìn)制數(shù)力图,我們的表示就應(yīng)該是1.XXX 2X,由于第一位永遠(yuǎn)都是1所以直接省去掺逼,因此表示為S.M*2E吃媒。所以float的取值范圍是-2128到2128,遠(yuǎn)遠(yuǎn)大于long的最大值。
所以java中l(wèi)ong類型自動(dòng)轉(zhuǎn)換為float類型赘那。
簡(jiǎn)單來(lái)說(shuō)因?yàn)楦↑c(diǎn)數(shù)用科學(xué)計(jì)數(shù)法存儲(chǔ)的刑桑,而整數(shù)是用二進(jìn)制存儲(chǔ)的。所以雖然long型是64位的募舟,float型是32位祠斧,但是float型所能表示的數(shù)要遠(yuǎn)遠(yuǎn)大于long型。