在C

时间:2015-11-10 15:09:08

标签: c precision point ieee-754

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

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

typedef DWORD unsigned long;

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

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

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

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

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

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

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

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

这里打印random_char_pointer到屏幕给我230.75所以sprintf必须正确处理解释。因此我假设C中已经存在某些东西。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:7)

这样做的推荐方法是使用union:

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中描述的新类型(有时称为“类型双关”的过程)。这可能是陷阱表示。