myfocus-2048857 发表于 2017-2-10 11:01:21

16进制的浮点数 如何换算为 10进制的浮点数?

见附图
单片机输出了 两个16进制的浮点数(分别为:3E 4E 82 E5和43 B9 46 29)。
MCU为STM32F030。

请教:
如何将这两个16进制的浮点数转换为10进制的浮点数 ?

谢谢!

附图


creep 发表于 2017-2-10 14:21:22

浮点数在内存中是用4个字节的表示的,知道了这个之后借助联合体可以有下面的一个可行的方法:

union UFloat
{
float f;          // 浮点数
uint8_tby4; // 对应的16进制数据
};

floata,b;

floatc0 = -7.691887,d0 = 4.412552;

union UFloat ua,ub,uc,ud;

int main(void)
{   
    //数组buff中存的16进制数据即为浮点数c0,d0对应的16进制
    uint8_t buff[] = {0xF0,0x23, 0xF6,0xC0,0xA0, 0x33,0x8D,0x40};
    uint8_t t;
    //将浮点数c0,d0对应的16进制分别赋值给联合体ua,ub
    for(t = 0;t < 4;t++)
    {
      ua.by4 = buff;
      ub.by4 = buff;
    }
    //取得联合体ua,ub中浮点数的值赋值给a,b
    a = ua.f;
    b = ub.f;
    //将相应的浮点数赋值给联合体uc.f和ud.f
    //便于查看浮点数c0,d0对应的16进制
    uc.f = c0;
    ud.f = d0;
    //从调试结果可以看到a的值和c0的相等.b的值和d0的相等
}   
运行结果:


myfocus-2048857 发表于 2017-2-10 15:30:26

creep 发表于 2017-2-10 14:21
浮点数在内存中是用4个字节的表示的,知道了这个之后借助联合体可以有下面的一个可行的方法:




学习了,非常感谢 !

埃斯提爱慕 发表于 2017-2-11 18:27:21

wdliming-222461 发表于 2020-2-3 17:35:59

谢谢分享

aiherong 发表于 2020-2-10 03:21:27

很可惜!后起之秀的孩子们极少愿与16进制、二进制打交道,宁肯大费周张
其实对32位机如果一个数超出4个字节(int 型就是4X8=32位)就可能是long或float ,区别在于是否需要"补"运算
比如:0xFFFF = -1; 0xfffe =-2… 在我记忆中是符点数与十进制是应该有一算法可实现的
页: [1]
查看完整版本: 16进制的浮点数 如何换算为 10进制的浮点数?