追本溯源——JAVA中爲什麼float型最大值大於long型?

 最爲一個常識,我們都知道浮點型在內存中佔用的是4個字節的空間,而long型佔用的是8個字節的空間。可是爲什麼4個字節的float型的最大值會大於long型的最大值呢?

       我們都知道,float類型的範圍是:一3.403E38~3.403E38。而long類型的範圍是:-2^63~2^63-1(大概是9*10^18)。

       我以前也是簡單的記住就算完事了,對於它爲什麼會這樣卻沒有考慮過。

 

       下面給大家分享一下我現在的理解:

         long整型數,在內存中佔用8個字節共64位,它表示的數值有264次方,平分正負,數值範圍是負263次方到正263次方-1

    而float在內存中佔4個字節,共32位,但是浮點數在內存中是這樣的:

        V=(-1)^s * M * 2^E

 

    浮點數的32位不是簡單的直接表示大小,而是按照一定的標準分配的。

    其中第1位,符號位,即S

    接下來的8位,指數域,即E

    剩下的23位,小數域,即MM的取值範圍爲[12)或[01)。

    也就是說,浮點數在內存中的二進制值不是直接轉換爲十進制數值的,而是按照上述公式計算而來,通過這個公式,雖然只用到了4個字節,但是浮點數卻比長整型的最大值要大。

 

    這也就是爲什麼在數據轉換的時候,long類型轉換爲float類型的根本原因所在!



宮博:對於類似float這種存儲方式,在oracle的數據存儲結構中,也用到了,有多少位有效數字,就有多長的存儲(當然固定幾個字節表示 正負 和 長度)


發佈了8 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章