Java中為什么long能自動轉換成float類型


刷題時候看到一個float和long相互轉換的問題,float向long轉換的時候不會報錯,一個4個字節一個8個字節,通過baidu找到了答案。

下面轉載自http://blog.csdn.net/shanshan1yi/article/details/48477119

/*****************************分割線***************************************/

作為一個常識,我們都知道浮點型在內存中占用的是4個字節的空間,而long型占用的是8個字節的空間。可是為什么今天在寫JAVA程序時犯了一個錯誤,最后才知道4個字節的float型的最大值會大於long型的最大值。發現了這個錯誤我很吃驚,於是查資料才知道原因。

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

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

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

  long整型數,在內存中占用8個字節共64位,它表示的數值有2的64次方,平分正負,數值范圍是負2的63次方到正2的63次方-1。

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

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

   

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

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

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

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

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

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


免責聲明!

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



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