好程序員Java學習路線float在內存中的存儲

好程序員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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章