将一个32位浮点数转换为两个16位uint数,然后再转换回该32位浮点数

时间:2014-09-24 08:44:14

标签: c

我正在研究从一个平台到另一个平台的32位浮点数。那么它只允许将16位unsinged int成员传递给transfter寄存器。我想我可以将32位浮点分成两个16位然后再转换到另一侧的32位。

(我正在使用C语言)

像:

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

float D = C<<16 & B;

Obevious这是不正确的,因为float数据在分配时将转换为unsigned int。那我该怎么办呢?做一些类似的事情会有一些相当成熟的方法

由于

1 个答案:

答案 0 :(得分:5)

您可以使用联合,例如:

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