在c中输入coercion:unsigned int to float

时间:2011-06-08 15:19:07

标签: c floating-point integer coercion

我在主机和嵌入式处理器之间进行串行通信。在嵌入式方面,我需要解析浮点和整数数据的字符串。我目前正在做的事情就是这样:

inline float32* fp_unpack(float32* dest, volatile char* str) {
    Uint32 temp = (Uint32)str[3]<<24;
    temp |= (Uint32)str[2]<<16;
    temp |= (Uint32)str[1]<<8;
    temp |= (Uint32)str[0];
    temp = (float32)temp;
    *dest = (float32)temp;

    return dest;
}

其中str有四个字符,每个字符代表一个浮点字节。字符串中的字节是有序的小端。

举个例子,我试图从str中提取数字100.0。我已经验证了字符串的内容是:

s [0]:0x00, s [1]:0x00, s [2]:0x20, s [3]:0x41,

是100.0的32位浮点表示。此外,我已经验证该函数成功将temp设置为0x41200000。但是,dest最终为0x4e824000。我知道问题来自于:* dest =(float32)temp,我希望它只是简单地将位从temp复制到dest,并使用类型转换使编译器满意。

然而,我已经意识到情况并非如此,因为操作:float x =(float)4/3实际上将4转换为4.0,即更改位。

如何将temp中的位强制转换为dest?

提前致谢

编辑:注意0x4120000作为整数是1092616192,作为一个浮点数,是0x4e82400

4 个答案:

答案 0 :(得分:5)

你需要施放指针。转换值只是将int转换为float。尝试:

*dest = *((float32*)&temp);

答案 1 :(得分:4)

由于别名规则违规而未调用未定义行为的可移植方式:

float f;
uint32_t i;
memcpy(&f, &i, sizeof f);

答案 2 :(得分:3)

这是另一个解决方案:

union test {
     float f;
     unsigned int i;
} x;

float flt = 100.0;
unsigned int uint;

x.f = flt;
uint = x.i;

现在unit具有f中的位模式。

答案 3 :(得分:0)

不是浮点数100.0的十六进制(IEEE754)表示 - > 0x42c80000