深度剖析數據在內存中的存儲2——浮點數數在內存中的存儲
阿新 • • 發佈:2019-04-28
warnings print 會有 裏的 空間 eee 地址 ngs 根據 根據國際標準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、因為1<=M<2,所以小數點前必定是1,所以可以省略1和小數點,這樣一來,對於單精度浮點數存儲方式,23位有效數位存的都是小數部份數。讀取時,小數點和1都會被自動加上。等於可以保留24位有效數字。雙精度同理。
2、對於指數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
練習代碼:
(-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會有一些特殊規定:
2、對於指數E來說,首先說明他是一個無符號整數,對於單精度浮點數存儲方式,E共占8位,則E的取值範圍為0~255。但是科學記數法中,指數是可以為負數的,所以規定,存入內存時,E的真實值必須加上一個中間數,對於8位的E,這個中間數為(255/2=)127(實際表達範圍-127~128),對於11位的E,這個中間數為1023(實際表達範圍-1023~1024)。取數時,再減去127/1023即為實際值。(移碼)
註意:因為當E為全零時,實際上指數為-127,表示一個接近零很小的數,因此浮點數不能與零比較,用精度來代替。當E為全一時,表示的±無窮大。
綜述:整數與浮點數的存儲方式完全不同,整數存取為原反補碼,浮點數為S、E、M
練習代碼:
#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; }
深度剖析數據在內存中的存儲2——浮點數數在內存中的存儲