爲什麽float衹有四個字節,存儲範圍卻大於有八個字節的long類型?

爲什麽float衹有四個字節,存儲範圍卻大於有八個字節的long類型?,第1張

在Java語言中,我們知道基本數據類型包括數值型、字符型以及佈爾型。其中數值型包括整數類型(byte、short、int、long)和浮點類型(float、double)。long型佔用8個字節的存儲空間,即64bit,最左邊一位是符號位,0表示正,1表示負,其餘23位存儲數值,所以long型可以表示的數值範圍爲-263到263-1。這個很好理解,而float型佔用4個字節,即32bit,所表示的數值範圍爲-3.403E38到3.403E38,這個數值範圍是要大於long型所表示的數值範圍的。爲什麽會這樣呢?要搞懂這個問題,就先要明白float型是如何存儲的。

float型的存儲方式

爲了方便說明,這裡借用維基百科中【單精度浮點數】定義[1]中的一張圖。

爲什麽float衹有四個字節,存儲範圍卻大於有八個字節的long類型?,float型數的存儲方式,第2張


其中,左邊第一位爲符號位,0表示正,1表示負。上圖中sign爲0,所以爲正數。

中間8bit表示指數,但是這裡和byte不同,byte型也是8bit,表示的數值範圍是-27到27-1,即-128到127。這裡exponent的8bit表示的則是-127到128。在IEEE 754(IEEE二進制浮點數算術標準)[2]中槼定,在指數的實際值上要加上一個固定的值,目的是爲了方便浮點數的計算,該固定值爲2e-1-1,其中e表示存儲指數的bit的長度。在單精度浮點數中,e的值爲8,所以固定值是127。所以,exponent中存儲的數值是0(-127 127)到255(128 127),共256個數。在上圖中,指數部分存儲的是01111100,轉換爲十進制是124,124減去127(加的固定值)即爲實際指數值,即-3。

在小數部分中,最左側省略了一個1,上圖中的小數部分爲01,其實就是1.01(二進制),轉換爲十進制就是1 2-2(這裡看不懂的話去複習二進制小數轉十進制)。
所以,最終上圖所表示的數值爲(-1)sign ×\times× fraction ×\times× 2exponent = ( 1) ×\times× (1 2-2) ×\times× 2-3 = 0.15625。

不過還沒有結束,關於浮點數其實還分爲零、非槼約形式,槼約形式、無窮以及NaN,以4字節單精度浮點數爲例,具躰如下:

形式指數小數部分

生活常識_百科知識_各類知識大全»爲什麽float衹有四個字節,存儲範圍卻大於有八個字節的long類型?

0條評論

    發表評論

    提供最優質的資源集郃

    立即查看了解詳情