先说怎么把浮点型转换成二进制进行存储吧
举例:
123.25
123二进制表示为: 0111 1011,具体的计算过程就是除2求余
0.25表示为:01 ,具体计算过程就是乘以2取整数
0.25*2=0.5 0.5*2=1
所以123.45的二级制表示为:0111 1011.01
接着说二进制的存储格式吧:
float类型也会转换成科学计数表达方式 value=a*2^n 其中a>=1 , a<2; a叫尾数,n叫指数。
针对float类型,占4个字节,bit[0]为正负号位,bit[1-8]为指数部分,bit[9-31]为尾数部分。
那么根据以上规则以及计算结果,123.25的二进制表示应该是:
bit[0] 0
bit[1-8] 0000 0110
123.25的二级制表示0111 1011.01转换成科学计数法应该为1.11 101101*2^6,指数为6
bit[9-31] 1110 1101 0000 0000 0000 000
123.25的二级制表示0111 1011.01转换成科学计数法应该为1.11 101101*2^6,由于小数点前的1位固定1,所以可以去掉,只保留小数点后面的。
int main()
{
typedef struct _FP_SIGLE{
unsigned int nMantissa : 23; //尾数部分
unsigned int nExponent : 8; //指数部分
unsigned int nSign : 1; //符号位
} FP_SINGLE;
float a = 123.25;
printf("a is %f\n",a);
FP_SINGLE* p = (FP_SINGLE*)&a;
printf("%d, %#X, %#X\n", p->nSign, p->nExponent-127, p->nMantissa);
return 0;
}
运行结果:
a is 123.250000
0, 0X6, 0X768000
参考链接:http://blog.csdn.net/czg13548930186/article/details/72808396
还请各位在评论区贴下官方文档对于float的权威解释链接。