408 字
2 分钟
浮点数的转换和存取
2022-09-15

前言#

C 语言情况下,实现images。

最近的 STC 项目中有数据存储的要求,即通过字节串的形式存储数据,像 u8、u16、u32 等都可以通过 >> 移位获取单个字节,但 float 浮点数则会报错。

所以需要将 float (32-bit) 变量的数据赋值给 unsigned long (32-bit) 变量,然后再通过移位获取和存储数据。

这里并不是指 float 到 unsigned long 的数据转换,而是将 float 的二进制数据通过 unsinged long 格式进行表达,数据在底层存储上是一致的,具体原因需要了解 float 数据的定义。

类型十进制十六进制(存储)
float114.5140x42E5072B
unsigned long11223058350x42E5072B

声明指针#

float a = 114.514;
unsigned long b;
b = *((unsinged long*)&a);
printf("a DEC: %f\r\n", a);
printf("a HEX: %lx\r\n", a);
printf("b DEC: %ld\r\n", b);
printf("b HEX: %lx\r\n", b);

这种方法的具体思路是:

  • (unsigned long*) 声明一个 u32 格式的指针
  • (unsigned long*)&a 将声明的指针指向变量 a 的地址
  • *((unsigned long*)&a) 以 u32 格式获取对应地址的数据

简单来说,将一个 u32 格式的指针指向变量 a 的地址,然后通过该指针读取对应地址上的数据。

共用体 (union)#

typedef union
{
float fdata;
unsigned long u32data;
}FloatU32Type
FloatU32Type a;
a.fdata = 114.514;
printf("a DEC: %f\r\n", a.fdata);
printf("a HEX: %lx\r\n", a.fdata);
printf("b DEC: %ld\r\n", a.u32data);
printf("b HEX: %lx\r\n", a.u32data);

共用体 (union) 公用的内容本质上是数据的起始地址:

  • float 和 unsigned long 数据结构长度相同
  • fdata 和 u32data 是指向同一地址的两个变量

最终实现的效果同上。

2022-09-15 如果为 fdata 赋值 0x42E5072B,使用 u32 能完成读出数据,而 u16 只能读取 0x42E5

浮点数的转换和存取
https://fuwari.vercel.app/posts/嵌入式/stc/浮点数的转换和存取/
作者
Asuwee
发布于
2022-09-15
许可协议
CC BY-NC-SA 4.0