Java語言中:float、double數據類型在內存中是如何存儲的


引用參考

https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528

https://blog.csdn.net/yansmile1/article/details/70145416

  java語言中,float類型數字在計算機中用4個字節(32位)來存儲。double類型占用8個字節(64位)。 從存儲結構和算法上來講,double和float是一樣的,不一樣的地方僅僅是float是32位的,double是64位的,所以double能存儲更高的精度。

  按照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法:用符號指數尾數來表示。指數可正可負,所以,IEEE規定,此處算出的次方必須減去127才是真正的指數。底數定為2,即把一個浮點數表示為尾數乘以2的指數次方再添上符號

下面是具體的規格: 

類型 符號位 指數 尾數 長度
float 1 8 23 32
double 1 11 52 64


  

 

 

 

以float為例:

  因為指數需要減去127,所以float類型的指數可從-126到128

科學計數法:

  格式:
    SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

    S表示浮點數正負

    E表示指數加上127的值后得到的二進制數據

    M表示尾數,最高位固定為1

  舉例

    17.625在內存中的存儲為:

    首先要把17.625換算成二進制:10001.101。

    整數部分:除以2,直到商為0,余數反轉。(即:模2取余法)

       17 % 2 = 8  ---> 1    低位

        8 % 2 = 4  ---> 0

        4 % 2 = 2  ---> 0

        2 % 2 = 1  ---> 0

        1 % 2 = 0  ---> 1   高位

       小數部分:乘以2,直到乘位為0,進位順序取。(即:乘2取整法)

      按如下算法進行: 

        1)首先給小數部分乘2,得到的數,如果小數點前為1;則計1,為0,則計0。

        2)再對剩下的小數部分乘2,再計出1或0。 

        3)重復以上步驟,直至達到需要的精度。

      0.625 x 2 = 1.25   --->  1  -1位

      0.25  x 2 = 0.5    --->  0  -2位

      0.5   x 2 = 1.0    --->  1  -3位

      0.0   x 2 = 0.0    --->  0  -4位

      ........

      以上得到17.625換算成二進制為10001.101。

     再將10001.101右移,直到小數點前只剩1位,1.0001101 * 24 ,右移動了四位。

      此時,底數和指數就出來了。

      底數:因為小數點前必為1,所以IEEE規定只記錄小數點后的就好。所以,此處的底數為:0001101

      指數:實際為4,必須加上127(轉出的時候,減去127),所以為131。也就是10000011

        符號:因為是正數,所以是0

   綜上所述,17.625在內存中的存儲格式是:01000001 10001101 00000000 00000000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM