我正在努力将一个 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]);
注意:严格来说这是未定义的行为,但它是一种广泛使用的技术,不太可能失败。或者,您可以采用更安全但效率可能较低的方法,只需使用 memcpy,如下所示:
float f = 3.14f;
uint16_t a[2];
memcpy(a, &f, sizeof(a));
printf("%g -> %#x %#x\n", f, a[0], a[1]);
关于将一个 32 位 float 转换为两个 16 位 uint 数,然后再次转换回那个 32 位 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26012374/