好程序員Java學習路線float在內存中的存儲,最近在講Java基礎,講到數據類型的轉換,提到整數類型長字節類型數據放到短字節類型數據中時,因爲字節數不夠,會截斷數據,因此須要程序員手動強制類型轉換,例如將int型的數據放到byte類型中。 後來學生提出一個問題,爲何float只有4個字節,而long有8個字節,將一個long數據放入到一個float中時不須要強制轉換,而將float放到long中卻須要強制轉換呢? 要理解這個問題,首先咱們要知道float中能夠存儲小數,而long只能存儲整數,全部float的數據放到long裏須要強制轉換。 至於爲何long放到float裏不須要強制轉換,須要瞭解float存儲數據的機制,float中存儲數據的時候是以科學計數法的方式計數的,全部可以存儲的整數大小要超過long類型,因而long數據放到float中是沒有問題的,只是可能會偏差很大而已。 具體來講,float中存儲一個數字時,是按照這樣作的: float有4個字節,即32個bit
32 31 30-24 23-1
符號位 指數符號位 指數 數字程序員
1. 將10進制的小數轉換成2進制的小數。 2. 將小數點移動(左移或右移n位)到第一個數字1後,獲得一個相似1.01001…這樣的一個二進制小數m。
3. 根據小數的正負將第32位(最高位)的符號位填充,正數爲0,負數爲1。
4. 根據移動的方向肯定第31位的值,若是向左移則爲1,向右移或者不動爲0。
5. 若是是向左移,將n-1後轉換成2進制,並在左邊補零到7位長度,填充到30-24位的指數位上。若是是不動或向右移,將n轉換成2進制,並在左邊補零到7位長度,並每一位求反填充到30-24位。
6. 將數字m去掉整數位和小數點後,截斷23位長度填充到23-1位。
例如:數字12.1
轉換成2進制後爲:1100.0001100110011001100110011001100110011001100110011
將數字往左移3位爲:1.1000001100110011001100110011001100110011001100110011
由於數字12.1爲正數,因此float的第32爲0。
由於往左移,因此第31位爲:1
由於往左移了3位,3-1=2,因此第30-24位爲:0000010
最後,將小數點後面的數字截斷23位,因此第23-1位爲:1000001 10011001 10011001
最終12.1表示成2進制在內存中保存爲:0 1 0000010 1000001 10011001 10011001學習