如何把十进制浮点数转换为十六进制的32位单精度IEEE754格式

2020-01-20 19:14发布

如何把十进制浮点数转换为十六进制的32位单精度IEEE754格式呢?
比如一个十进制数0d1010.0,转换为IEEE754格式为0x447C8000,然后把数据发送出去,
搜索一番,没找到答案,好像是库函数可以?哪位有代码呢,谢谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
arm7tdmi
1楼-- · 2020-01-22 00:05
xf331785508 发表于 2015-1-14 17:31
好吧。正式回复一下;

这种办法貌似不行啊,能得到整数部分,小数部分总是被抹去,变为0,
xf331785508
2楼-- · 2020-01-22 04:08
 精彩回答 2  元偷偷看……
xf331785508
3楼-- · 2020-01-22 06:23
本帖最后由 xf331785508 于 2015-1-15 18:08 编辑
arm7tdmi 发表于 2015-1-15 16:37
这种办法貌似不行啊,能得到整数部分,小数部分总是被抹去,变为0,

  1. union  Data
  2. {
  3.     double  srcData;
  4.     u8        memData[sizeof(srcData)];
  5. };


  6. double am = 1010.0f;
  7. union Data   d;
  8. void  fun(void)
  9. {
  10.      unsigned char table[sizeof(am)] = {0}, i = 0, *p = NULL;
  11.      p = (unsigned char*)&am;
  12.      for( i = 0; i < COUNTOF(table); i++ ){
  13.         table[i] = *(p + i);
  14.         printf("table %u value is %u ", i, table[i]);
  15.      }
  16.      d.srcData = am;
  17.      printf("%u ", d.memData[0]);
  18.      MemToFlash(d.memData, sizeof(d));
  19.      sendData((u8*)d.memData, sizeof(d)); //  <==> sendData((unsigned char*)&am, sizeof(am));
  20. }


  21. //你的代码改一下也是等效的
  22. double a = 1010.001;
  23. unsinged char txdata[sizeof(a)] = {0};

  24. void func(void)
  25. {
  26.         unsigned long  data = 0;
  27.         a=1010.0f;                 //10进制
  28.         data = *((unsigned long*)&a);
  29.         txdata[0] = (data >> 56)  &  0xff;
  30.         txdata[1] = (data >> 48)  &  0xff;
  31.         txdata[2] = (data >> 40)  &  0xff;
  32.         txdata[3] = (data >> 32)  &  0xff;
  33.         txdata[4] = (data >> 24)  &  0xff;
  34.         txdata[5] = (data >> 16)  &  0xff;
  35.         txdata[6] = (data >> 8)   &  0xff;
  36.         txdata[7] = a  & 0xff;       //发送代码
  37. }

复制代码
arm7tdmi
4楼-- · 2020-01-22 08:44
哎,草草草,我的错,检查出来了,浮点数半路上总是赋值给long型变量,然后又赋值了float变量,所以小数部分总是被抹去了。
另外用下面这个也行:
unsigned long float_to_bits(float x)
{
    unsigned long y;
    memcpy(&y, &x, 4);
    return y;
}
mangocity
5楼-- · 2020-01-22 09:26
参考一下。
        //Modbus 报文 AE F8 41 55
        unsigned char data[4] = {0xF8, 0xAE, 0x55, 0x41, };
        float* f;
        f = (float*)data;
        printf("报文数值为: %g ", *f);

一周热门 更多>