繁体   English   中英

c 中的类型强制:unsigned int to float

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM