找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2171|回复: 0
打印 上一主题 下一主题
收起左侧

关于C语言中float、double类型的内存转换

[复制链接]
跳转到指定楼层
楼主
ID:724590 发表于 2020-4-8 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     C51 平台上存在数据类型限制——double数据类型与float数据类型皆为32bites,使得double数据类型等同于float数据类型。

     当C51在与其它平台做数据通信时,可能被要求提供64bites的double数据,但它无法用数据类型强转实现。因此,专门写了float转double存储的函数。

     有关float、double类型在内存中的具体存储方式,可阅读相关博文https://blog.csdn.net/slience_j/article/details/51965009
     实现float存储转double类型存储的具体函数如下:
  1. #pragma pack(1)
  2. struct DOUBLE_MEM
  3. {
  4.         char data0;
  5.         char data1;
  6.         char data2;
  7.         char data3;
  8.         char data4;
  9.         char data5;
  10.         char data6;
  11.         char data7;
  12. };
  13. #pragma pack()

  14. void float_to_double(float f, struct DOUBLE_MEM *pStrBob)
  15. {
  16.         short index;                        // 指数
  17.         long *pdata = (long *)&f;        // 指针指向需转换float数据

  18.         // 获取float变量8位有效指数信息
  19.         index = (*pdata >>23)&0x00ff;        
  20.         // 将8位指数转换为11位指数
  21.         if(index & 0x0080)                // 指数为正(bit7表示正负,bit0~6为大小)
  22.         {
  23.                 index &= 0x007f;        // bit7~15置0
  24.                 index |= 0x0400;        // bit10  置1
  25.         }else
  26.         {
  27.                 index |= 0xff80;        // bit 7~15置1
  28.                 index &= 0x03ff;        // bit10~15置0
  29.         }
  30.         
  31.         // 装载index指数信息
  32.         pStrBob->data0 = (index>>4)&0x7f; // 将index的高7位(bit4~10位)数据放在低7位存储
  33.         pStrBob->data1 = (index &0xf)<<4; // 将index的低4位(bit0~3位)数据放在高4位存储

  34.         // 装载符号信息(存放在最高位)
  35.         if(*pdata & 0x80000000)
  36.         {
  37.                 pStrBob->data0 |= 0x80;
  38.         }
  39.         else
  40.         {
  41.                 pStrBob->data0 &= 0x7f;
  42.         }

  43.         // 装载尾数位(bit0~bit22共23位有效数据)
  44.         pStrBob->data1 |= (*pdata >>19)&0x0f;        // 将bit19~22  放至data1的低4位
  45.         pStrBob->data2 = (*pdata >>11)&0xff;        // 将bit11~18  放至data2
  46.         pStrBob->data3 = (*pdata >>3)&0xff;        // 将bit3~bit10放至data3
  47.         pStrBob->data4 = (*pdata &0x7)<<5;        // 将bit0~bit2 放至data4的高3位
  48.         pStrBob->data4 &= 0xe0;                        // data4的低5位清零
  49.         pStrBob->data5 = 0x0;
  50.         pStrBob->data6 = 0x0;
  51.         pStrBob->data7 = 0x0;
  52. }
复制代码




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表