【发布时间】:2015-11-10 15:09:08
【问题描述】:
我使用的是 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 中已经有一些东西适合我。有人可以帮忙吗?
【问题讨论】:
-
f = *(float*) &uvalue;(加/减对齐注意事项) -
@joop 这不就相当于转换为
float吗? -
不,我将一个 unsigned int pointer 转换为一个浮点 pointer 并取消引用它。
-
没有标准的 C 编译器。 “基于标准 C 编译器”是什么意思?
-
顺便说一句:这可能是 XY 问题。 为什么您将 4 字节块接收到 uint32_t 类型值中?由于 rs485 传输的基本单位是 8 位字符,你也可以将 4 个连续字节接收到一个
char data[sizeof floatval];对象中,并使用memcpy(&floatval, data, sizeof data);进行转换
标签: c precision point ieee-754