深度剖析數據在內存中的存儲2——浮點數數在內存中的存儲

根據國際標準IEEE:任意一個二進制浮點數V能夠表示爲下面形式:
(-1)^SM2^E:
(-1)^S表示符號位,當S爲0,V爲正數;當S爲1,V爲負數。由其物理結構決定了,浮點數爲有符號數。
M爲有效數字,大於等於1,小於2。
2^E表示指數位。
eg:5=>0101=>(-1)^01.012^2. S=0,M=1.01,E=2
規定:對於32位的浮點數(單精度浮點數存儲),最高1位是符號位(S),接着的8位爲指數位(E),剩下的23位是有效數字位(M),不滿23位後面補0。
對於64位的浮點數(雙精度浮點數存儲),最高1位是符號位(S),接着的11位爲指數位(E),剩下的52位是有效數字位(M)。
對於有效數字M和指數E會有一些特殊規定:
一、由於1<=M<2,因此小數點前一定是1,因此能夠省略1和小數點,這樣一來,對於單精度浮點數存儲方式,23位有效數位存的都是小數部份數。讀取時,小數點和1都會被自動加上。等於能夠保留24位有效數字。雙精度同理。
二、對於指數E來講,首先說明他是一個無符號整數,對於單精度浮點數存儲方式,E共佔8位,則E的取值範圍爲0~255。可是科學記數法中,指數是能夠爲負數的,因此規定,存入內存時,E的真實值必須加上一個中間數,對於8位的E,這個中間數爲(255/2=)127(實際表達範圍-127~128),對於11位的E,這個中間數爲1023(實際表達範圍-1023~1024)。取數時,再減去127/1023即爲實際值。(移碼)
eg. 由上面可知,5的指數爲2,對於單精度浮點數存儲方式,實際在內存中存儲的數爲127+2=129=>1000 0001。
注意:由於當E爲全零時,實際上指數爲-127,表示一個接近零很小的數,所以浮點數不能與零比較,用精度來代替。當E爲全一時,表示的±無窮大。
綜述:整數與浮點數的存儲方式徹底不一樣,整數存取爲原反補碼,浮點數爲S、E、M
練習代碼:ide

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
    int n = 9;                        //0000 0000 0000 0000 0000 0000 0000 1001
    float pFloat = (float)n;          //將9取出,轉爲浮點型,再存給pFloat
    float *pfloat = (float *)&n;      //將n的地址轉爲浮點數地址(即看待n的方式變爲浮點數)。
    printf("n=%d\n", n);
    printf("pFloat=%f\n", pFloat);
    printf("*float=%f\n", *pfloat);   //解引用後以浮點數形式看待空間裏的值  0 00000000 00000000000000000001001   S=0,E=0,(-127)
    *pfloat = 9.0;                    //1001 實際n空間中存的值0 00000011 00100000000000000001001 
    printf("n=%d\n", n);              //轉換爲整數爲 1091567616
    printf("*float=%f\n", *pfloat);   // 9.000000
    system("pause");
    return 0;
}