任何數據在內存中都是以二進制的形式存儲的。浮點數也不例外。浮點的存儲方式與整數有一點區別就是:浮點的存儲方式是採用:符號位+階碼+尾數的形式。
符號位:在計算機內存中,一般都是以一位表示正數(用0表示)或者負數(用1表示)
階碼:在機器中表示一個浮點數時須要給出指數,這個指數用整數形式表示,這個整數叫作階碼,階碼指明瞭小數點在數據中的位置。它與科學計數法中的冪是一個道理。
尾數:指小數點後面的數
例:
將133.5f化爲二進制數。首先將整數部分化爲二進制數爲
1000 0101
而後將小數部分化爲二進制爲0.1。則133.5的二進制數爲
1000 0101.1
而在計算機中是怎麼樣存儲這個數的呢?首先將這個二進制數用「科學計數法」的形式表示出來就是
1.0000 1011 * 2^7
這裏階碼採用移碼錶示,對於float型數據其規定偏置量爲127,階碼位數爲8位(對於雙精度來講,其規定的偏置量爲1023。階碼位數爲11位。),也就是說這裏的階碼應該爲127+7 = 134。將其化爲二進制數爲
1000 0110
因爲規定小數點前面都爲1,所以在計算機中,將不會存儲小數點前面的1。這裏的尾數就爲00001011。其後所有補0,將其補充到23位。這裏是正數,因此符號位爲0。
在存儲時,符號位在最前面,其次是階碼,最後放尾數。所以數字在內存中存儲爲:
0100 0011 0000 0101 1000 0000 0000 0000
其十六進制表示爲:
0x43058000
如下爲測試代碼:
#include <stdio.h>
int main()
{
float num = 133.5f;
int *p = (int *)#
printf("0x%x\n", *p);
return 0;
}
上機運行可獲得輸出結果爲: 0x43058000測試