[英]Type coercion in c: unsigned int to float
我在主机和嵌入式处理器之间进行串行通信。 在嵌入式方面,我需要解析浮点和 integer 数据的字符串。 我目前正在做的事情是这样的:
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 位浮点表示。 此外,我已经验证 function 成功地将温度设置为 0x41200000。 然而,dest 最终是 0x4e824000。 我知道问题出在以下行:*dest = (float32)temp,我希望它可以简单地将位从 temp 复制到 dest,并使用类型转换使编译器满意。
但是,我意识到情况并非如此,因为操作:float x = (float)4/3 实际上将 4 转换为 4.0,即更改位。
如何将 temp 中的位强制转换为 dest?
提前致谢
编辑:请注意,作为 integer 的 0x4120000 是 1092616192,作为浮点数,它是 0x4e82400
您需要投射指针。 转换值只是将 int 转换为 float。 尝试:
*dest = *((float32*)&temp);
由于违反别名规则而不会调用未定义行为的可移植方式:
float f;
uint32_t i;
memcpy(&f, &i, sizeof f);
这是另一种解决方案:
union test {
float f;
unsigned int i;
} x;
float flt = 100.0;
unsigned int uint;
x.f = flt;
uint = x.i;
现在unit
具有与f
相同的位模式。
不是浮点 100.0 的十六进制 (IEEE754 ) 表示 --> 0x42c80000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.