浮點型數(shù)據(jù)存儲方式分析
也就是說我們可以認為float在小端CPU的編碼方式應該是:
31<-------------------------------------------------0
S(1bit)| E(8bits)| M(23bits) |
即:
-----------------------------------------------------
ADDR0+3ADDR0+2 ADDR0+1 ADDR0
ADDR0+3ADDR0+2 ADDR0+1 ADDR0
SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
-----------------------------------------------------
S:表示浮點數(shù)正負,1為負數(shù),0為正數(shù)。
E:指數(shù)加上127后的值的二進制數(shù)
M: 24-bit的底數(shù)(只存儲23-bit)
需要注意,浮點數(shù)為0時,指數(shù)和底數(shù)都為0,但此前的公式不成立。因為2的0次方為1,所以,0是個特例。當然,這個特例也不用認為去干擾,編譯器會自動去識別。
這樣我們就可以知道前面這個題中輸出的結果啦,從上面的分析可以知道一個float型的數(shù)的基本存儲方式,按照上面的實現(xiàn)可以知道5.0的存儲方式為如下的形式:
01000000101000000000000000000000
從上面的這個存儲形式我們可以得到基本的整形數(shù)值時0x40A00000。進而也就知道了4個bytes中的數(shù)值大小。
這是充分利用了聯(lián)合體的共享內存特性,我們改變程序如下所示:
#include
typedefuniontest
{
float a;
int i;
char c[4];
}Test;
{
float a;
int i;
char c[4];
}Test;
int main()
{
Test t;
t.a = 5.0;
printf("%f",t.a);
printf("%d",t.i);
printf("%c,%c,%c,%c",t.c[3],t.c[2],t.c[1],t.c[0]);
{
Test t;
t.a = 5.0;
printf("%f",t.a);
printf("%d",t.i);
printf("%c,%c,%c,%c",t.c[3],t.c[2],t.c[1],t.c[0]);
t.i = 65;
printf("%f",t.a);
printf("%d",t.i);
printf("%c,%c,%c,%c",t.c[3],t.c[2],t.c[1],t.c[0]);
return 0;
}
printf("%f",t.a);
printf("%d",t.i);
printf("%c,%c,%c,%c",t.c[3],t.c[2],t.c[1],t.c[0]);
return 0;
}
根據(jù)上面的分析,可以比較方便的計算出結果如下所示:

評論