将 32 位无符号 long 解释为 C 中的单精度 IEEE-754 浮点数

Interpreting a 32bit unsigned long as Single Precision IEEE-754 Float in C

我使用的是 Microchip 的 XC32 编译器,它基于标准 C 编译器。

我正在从 RS485 网络上的设备读取一个 32 位值,并将其存储在一个无符号长整数中,我将其类型定义为 DWORD。

typedef DWORD unsigned long;

就目前而言,当我将该值类型转换为浮点数时,我得到的值基本上是它的整数表示形式的浮点版本,而不是正确的 IEEE-754 解释浮点数。

DWORD dword_value = readValueOnRS485();
float temp = (float)dword_value;

在这里,dword_value 将以十六进制格式显示为 0x4366C0C4,作为十进制将表示为 1130807492 因此将其转换为浮点数只会给我 1.130807492*10^9 或 1130807492.0 这不是我想要什么。

我想要单精度 IEEE-754 表示,它会给我一个浮点值 230.75299072265625

很明显,类型转换为 float 对我不起作用。我需要一种可以将这种形式转换为我的方法。我在 XC32 库中找遍了,但找不到任何东西。

有谁知道预定义的方法可以为我正确地进行这种解释?或者我可以写一些建议的方法吗?我试图避免为这个特定任务编写自己的代码,因为我担心如果 C 已经有这个功能,我找不到有效的解决方案。

有趣的是,如果我对 char* 执行此操作,该 char* 上的值将正确表示为 230.75:

sprintf(random_char_pointer, "%.2f, dword_value);

此处在屏幕上打印 random_char_pointer 得到 230.75,因此 sprintf 必须正确地为我处理解释。因此,我假设 C 中已经有适合我的东西。有人可以帮忙吗?

做这样的事情的推荐方法是使用联合:

union {
    DWORD w;
    float f;
} wordfloat;

wordfloat.w = dword_value;
temp = wordfloat.f;

根据 ISO 9899:2011 §6.5.2.3 ¶3 脚注 95:

A postfix expression followed by the . operator and an identifier designates a member of a structure or union object. The value is that of the named member,95) and is an lvalue if the first expression is an lvalue. If the first expression has qualified type, the result has the so-qualified version of the type of the designated member.

95) If the member used to read the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called “type punning”). This might be a trap representation.