測試程序:
//main.c
int x = 0x1234;
int y = 0x2345;
int t = 0x3456;
int k = 0x4567;
void int2double();
int main(){
int2double();
printf("x:0x%x, y:0x%x, t:0x%x,k:0x%k\n", x, y , t, k);
return 0;
}
//int2double.c
double x;
float t;
void int2double(){
x = -0.0;
x = -8.25; //8.25 = 1000.01b
x = -0.25; //0.25 = 0.01b;
t = 0.0;
t = 8.25;
t = 0.25;
}
8.25用二進制數表示爲:1000.01,用科學計數法表示爲: 1.00001 * 2^3。
所以根據IEEE標準,float類型-8.25在內存中的存儲爲:
符號位-----指數(8位)-----尾數
1-----------127+3--------00001 ==0xc104 0000
根據IEEE標準,浮點數的指數部分要加上基127,尾數部分只取科學計數法的小數部分即可。
所以根據IEEE標準,double類型-8.25在內存中的存儲爲:
符號位------指數(11位)------尾數
1-----------1023+3----------00001 == 0xc020 8000 0000 0000
根據IEEE標準,浮點數的指數部分要加上基1023,尾數部分只取科學計數法的小數部分即可。
0.25用二進制數表示爲:0.01,用科學計數法表示爲: 1.0 * 2^(-2)。
所以根據IEEE標準,float類型-0.25在內存中的存儲爲:
符號位--------指數(8位)-----------尾數
1-------------127-2----------------0 == 0xbe80 0000;
double類型-0.25在內存中的存儲爲:
符號位--------指數(11位)----------尾數
1-------------1023-2---------------0 == 0xbfd0 0000 0000 0000;
那麼問題就來了,float類型的0.0在內存中怎麼存儲?
難道是下面這樣嗎?
符號位------指數-------- 尾數
0----------127+0---------0 == 0x7f80 0000
其實不是的,0.0在內存中的存儲就是0;
計算機不會按照float類型去存儲0.0,而是按照整數類型的0存儲的。