long類型在內存中占8個字節,float類型在內存中占4個字節,為什么long還要比float小呢?


結論:數值范圍大小和占用的字節沒有關系

float類型的范圍:

  • 負數:-3.402823E38~-1.401298E-45

  • 整數:0

  • 正數:1.401298E-45~3.402823E38

long類型的范圍:

  • -2的63次方到2的63次方-1(-9223372036854775808~9223372036854775807)

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

IEEE浮點標准:V = (-1) ^ S * M * 2 ^ E
浮點型數值內存分配示意圖
第一位 第二位到第九位 第十位到第三十二位
S E M

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

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

剩下的23位,小數域,即M,M的取值范圍為[1,2)或[0,1)。

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

示例如下:

 int n = 123456789;
 float f = n; // f is 1.23456792E8

從n到f轉換時,雖然得到了同樣大小的結果,但卻失去了一定的精度。

說白了就是long類型占用8個字節,是為了嚴密精確的表達每一位數值。float類型占用了4個字節,雖然表示數據范圍更大,但是存在精度損失。

那么為什么不把float占用的字節數也擴大,達到嚴密精確呢?

這是因為使用了IEEE浮點標准!


免責聲明!

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



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