将一个 32 位 float 转换为两个 16 位 uint 数,然后再次转换回那个 32 位 float

标签 c

我正在努力将一个 32 位 float 从一个平台传输到另一个平台。那么它只允许将 16 位 unsinged int 成员传递给传输寄存器。我在想,然后我可以将 32 位 float 分成两个 16 位,然后在另一侧再次转换为 32 位。

(我用的是C语言)

喜欢:

float A = 3.14
uint16_t B = A & 0xffff;
uint16_t C = A & 0xffff0000;

float D = C<<16 & B;

显然这是不正确的,因为 float 数据在分配时将被转换为 unsigned int。那我平时应该怎么做呢?应该会有一些比较成熟的方法来做类似的事情

谢谢

最佳答案

你可以为此使用 union ,例如:

typedef union {
    float f;
    uint16_t a[2];
} U;

U u;

u.f = 3.14f;

printf("%g -> %#x %#x\n", u.f, u.a[0], u.a[1]);

LIVE DEMO

注意:严格来说这是未定义的行为,但它是一种广泛使用的技术,不太可能失败。或者,您可以采用更安全但效率可能较低的方法,只需使用 memcpy,如下所示:

float f = 3.14f;
uint16_t a[2];
memcpy(a, &f, sizeof(a));
printf("%g -> %#x %#x\n", f, a[0], a[1]);

LIVE DEMO

关于将一个 32 位 float 转换为两个 16 位 uint 数,然后再次转换回那个 32 位 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26012374/

相关文章:

c - 使用 RegGetValue 显示值的数据

c - 发送短信 AT 命令

c - C标准是否指定递增指针时进位传播的距离?

c - 通过一次删除一个字符来均衡字符串中的字符数

c - Unix top 命令列从另一个 C 程序中选择?

c - 如何将机器代码发送到特定处理器?

c - 害怕二进制文件返回负值

c - 是否可以在 C 中优化并更快地将数组乘以数字?

c - 在多个进程之间共享 POSIX 信号量

python - bittorrent 中的 block 处理