最近在项目中想把浮点数存储到stm32的flash中,但flash的形式是以字节的形式存储。曾经也专门查过float在内存中的存储形式,根据IEEE 754的标准,浮点数由符号位、指数位、小数位组成。
我们都知道float占32位4字节,那将float转化需要用对应的32位存储,那我们选择unsigned int来存储float的字节。代码如下:
float a=-1.23;
unsigned int b;
b=*((unsigned int*)&a);//如果是直接b=(unsigned int)a的话,嘿嘿 。
printf("%x",b);
最后得到的结果是bf9d70a4,掏出计算器,这是我们想要的(但还是能看到精度所带来的问题)。
这样我们就把float转换为16进制数,便可以存储到flash中了。
不过问题又来了,当我将flash中的数读出来后,怎么存到转换为float呢?再3天的挣扎后,我学到了使用联合体union来存储。即解决了float转u32,又解决了u32转float。union与struct的区别是什么,直接上代码。
typedef union
{
float a;
unsigned int b;
}Data;
int main(void) {
Data data;
data.a=-1.23;
printf("%x",data.b);
return 0;
}
输出结果还是bf9d70a4,所以正因为float和u32都是占32个位,对任意一项改变也就是对另一项的改变,原因就是他们都存在同一个地址。