用C语言解释32位无符号长单精度IEEE-754浮点数

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

我正在从RS485网络上的设备读取32位值,并将其存储在unsigned long中,我将其命名为DWORD。

typedef DWORD unsigned long; 

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

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

这里,dword_value会以hex格式表示为0x4366C0C4,作为十进制表示为1130807492,因此将其类型转换为float只会给我1.130807492 * 10 ^ 9或1130807492.0这不是我想要的。

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

所以显然,对浮动进行类型转换对我来说不起作用。 我需要一种可以转换此forms的方法。 我在XC32库中看了一遍,但找不到任何东西。

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

有趣的是,如果我对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,这可以满足您的需求:

后缀表达式后跟. 运算符和标识符指定结构或联合对象的成员。 该值是指定成员的值, 95)如果第一个表达式是左值,则该值是左值。 如果第一个表达式具有限定类型,则结果具有指定成员类型的限定版本。

95)如果用于读取union对象内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的适当部分将被重新解释为新对象表示6.2.6中描述的类型(有时称为“类型双关”的过程)。 这可能是陷阱表示。