float与unsigned int的转换

  • Post author:
  • Post category:其他


最近在项目中想把浮点数存储到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个位,对任意一项改变也就是对另一项的改变,原因就是他们都存在同一个地址。



版权声明:本文为qq_41536436原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。