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