408 字
2 分钟
浮点数的转换和存取
前言
C 语言情况下,实现images。
最近的 STC 项目中有数据存储的要求,即通过字节串的形式存储数据,像 u8、u16、u32 等都可以通过 >> 移位获取单个字节,但 float 浮点数则会报错。
所以需要将 float (32-bit) 变量的数据赋值给 unsigned long (32-bit) 变量,然后再通过移位获取和存储数据。
这里并不是指 float 到 unsigned long 的数据转换,而是将 float 的二进制数据通过 unsinged long 格式进行表达,数据在底层存储上是一致的,具体原因需要了解 float 数据的定义。
类型 | 十进制 | 十六进制(存储) |
---|---|---|
float | 114.514 | 0x42E5072B |
unsigned long | 1122305835 | 0x42E5072B |
声明指针
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