浮點數的記憶體儲存
阿新 • • 發佈:2018-11-30
今天我們來探討一下浮點數的記憶體存儲存!
先來看一個例子:
int main()
{
int a = 9;
float *p = (float*)&a;
printf("%d\n", a);//以有符號十進位制整形方式列印
printf("%f\n", *p);//以有符號十進位制浮點數(float)方式列印
*p = 9.0;
printf("%d\n", a);//以有符號十進位制整形方式列印
printf("%f\n", *p);//以有符號十進位制浮點數(float)方式列印
system("pause");
return 0;
}
輸出結果是什麼呢?
是不是有點奇怪,為什麼存入的是 9,以 %f 方式打印出來的卻是0.000000
為什麼存入的是 9.0,以 %d 方式打印出來的卻是1091567616
我們猜測這應該就是浮點數在記憶體中的奇特儲存方式導致的,那麼現在就讓我們來研究研究:
先讓我們看看:為什麼存入的是 9.0,以 %d 方式打印出來的卻是1091567616
經過上圖的分析,我們就明白了,原來浮點數在記憶體中存的僅僅是該浮點數二進位制科學計數法表示中的
S((-1)的指數,代表符號位,0為正,1為負)【1bit】
E(進位制的指數,代表小數點後移位數)【8bit】【存的時候自動+127,取得時候自動-127】
M(有效數的精度位,即只存小數點後面的精度位)【23位】【存的時候忽略小數點前的【1 .】,取時自動加上【1 .】】
現在我們在看看:為什麼存入的是 9,以 %f 方式打印出來的卻是0.000000
相信現在我們都很清楚了,這就是說,CPU取資料的時候是按照浮點數的形式取得,左移計算出來的值也就是浮點型了。
上面我們還要討論一個關鍵的問題,那就是由上面可以看出浮點數和0比較時,不能直接用 == 和 0 比較,而應該這樣比較:
32位機器:
看完 float(4位元組)的儲存,
現在再來討論一下 double(8位元組)(雙精度浮點型)
注意兩點即可:
1 float 中存 +127 double 中存 +1023
2 float 中S [1bit] E [8 bit] M [23 bit]
double 中S [1bit] E [11 bit] M [52 bit]