深圳Java培訓:Java中的float在記憶體中的儲存

andy888發表於2019-08-01

深圳 Java 培訓: 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 位(最高位)的符號位填充,正數為 ,負數為 1

4. 根據移動的方向確定第 31 位的值,如果向左移則為 1 ,向右移或者不動為

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

因為往左移,所以第 31 位為: 1

因為往左移了 3 位, 3-1=2 ,所以第 30-24 位為: 0000010

最後,將小數點後面的數字截斷 23 位,所以第 23-1 位為: 1000001   10011001   10011001

最終 12.1 表示成 2 進位制在記憶體中儲存為: 0  1  0000010   1000001   10011001   10011001


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942977/viewspace-2652480/,如需轉載,請註明出處,否則將追究法律責任。

相關文章