转载自https://zhuanlan.zhihu.com/p/161206819
序
将float转换成char且保证精度数据不丢失,三种方法:强制类型转换、共同体、内存拷贝。
float在内存中的储存方式:https://blog.csdn.net/u014470361/article/details/79820892
一、强制类型转换
#include "stdio.h"
int main(void)
{
float fa = -123.56;
unsigned char farray[4] = { 0 };
*(float*)farray = fa;
printf("farray[0]=%#X,farray[1]=%#X,farray[2]=%#X,farray[3]=%#X\n", farray[0], farray[1], farray[2], farray[3]);
printf("%f\n", *(float*)farray);
return (0);
}
结果:
farray[0]=0XB8,farray[1]=0X1E,farray[2]=0XF7,farray[3]=0XC2
-123.559998
二、使用共同体转换
#include "stdio.h"
union {
float fa;
unsigned char farray[4];
}utemp;
int main(void)
{
int i = 0;
float ft = 0.0;
utemp.fa = (float)123.56;
printf("farray[0]=%#X,farray[1]=%#X,farray[2]=%#X,farray[3]=%#X\n", utemp.farray[0], utemp.farray[1], utemp.farray[2], utemp.farray[3]);
ft = *(float*)utemp.farray;
printf("%f\n", ft);
return (0);
}
结果:
farray[0]=0XB8,farray[1]=0X1E,farray[2]=0XF7,farray[3]=0X42
123.559998
三、使用memcpy
#include "stdio.h"
#include "string.h"
int main(void)
{
float fa;
unsigned char farray[4];
float ft;
fa = 45.23;
memcpy(farray, &fa, sizeof(farray));
printf("farray[0]=%#X,farray[1]=%#X,farray[2]=%#X,farray[3]=%#X\n", farray[0], farray[1], farray[2], farray[3]);
memcpy(&ft, &farray, sizeof(farray));
printf("%f\n", ft);
return (0);
}
结果:
farray[0]=0X85,farray[1]=0XEB,farray[2]=0X34,farray[3]=0X42
45.230000
建议使用共同体进行转换,提高系统的稳定性。