很多學C語言的人不知道的事兒,小數是如何存儲的?

 

很多學C語言的人不知道的事兒,小數是如何存儲的?二進制白學了

 

小數如何存儲

無論是單精度還是雙精度在存儲中都分爲三個部分:

  1. 符號位(Sign) : 0代表正,1代表爲負
  2. 指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲
  3. 尾數部分(Mantissa):尾數部分

其中float的存儲方式如下圖所示:

很多學C語言的人不知道的事兒,小數是如何存儲的?二進制白學了

 

而雙精度的存儲方式爲:

 

很多學C語言的人不知道的事兒,小數是如何存儲的?二進制白學了

 

float和double類型的數據在內存中的保存形式是一樣的,只是double表示的範圍更大而已。因此,這裏只介紹float的表示方法。double同理。

轉換舉例

舉例:22.8125 轉二進制的計算過程:

整數部分:除以2,商繼續除以2,得到0爲止,將餘數逆序排列。

 

很多學C語言的人不知道的事兒,小數是如何存儲的?二進制白學了

 

得到22的二進制是10110

小數部分:乘以2,取整,小數部分繼續乘以2,取整,得到小數部分0爲止,將整數順序排列。

很多學C語言的人不知道的事兒,小數是如何存儲的?二進制白學了

 

得到0.8125的二進制是0.1101

結果:十進制22.8125等於二進制00010110.1101

程序驗證

假設,我現在有一個數據-12.25。那麼這個數據在計算機內部是如何存儲的呢?
首先,將這個浮點數轉換成二進制數。經過轉換,得到的二進制數爲:1100.01。
接着,將這個二進制數用科學計數法來表示,1.10001 * 2 ^ 3。
由於這個數是負數。所以,符號位爲1;指數位爲127 + 3 = 130;尾數(小數)爲10001。
然後,將指數130轉換爲二進制數10000010。
最後,由於float佔4個字節,也就是32位,所以,-12.25在內存中表示爲:
11000001010001000000000000000000,將這個數用十六進制表示爲0xC1440000。
那麼,我們的計算結果對不對呢?我們可以用程序來驗證一下。

很多學C語言的人不知道的事兒,小數是如何存儲的?二進制白學了

完全正確

尾言

如果閣下沒有學習位運算不妨關注小編的零基礎視頻教程:

《C語言51課視頻教程合集》

《C語言十大新手練手項目實戰》

《C語言數據結構那點事兒》

通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢,人人都可以學習的C語言課程