请选择 进入手机版 | 继续访问电脑版
查看: 244|回复: 1

C/C++ 共用体(union)学习笔记

[复制链接]
  • TA的每日心情
    奋斗
    2019-7-30 12:25
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    3

    主题

    8

    帖子

    141

    积分

    大松子

    Rank: 2

    积分
    141
    QQ
    发表于 2019-7-30 13:25:15 | 显示全部楼层 |阅读模式
    • 最近做“课题”要用EEPROM,单是EEPROM还好,但是对EEPROM操作只能存入字节(byte)型的变量,但是我需要的是整数(int)型变量,发现大家一般用共用体把一个int分成两个byte存储,但是union是个什么玩应,杜洋老师也没讲过啊?我查了各种帖子、博客,再加上自己瞎鸡儿乱试,终于搞明白了,在这记录一下,也算是分享了,有不足的地方,欢迎大家批评指正。


      说,共用体还有一兄弟叫结构(struct),哥俩的区别在于共用体是几个变量共用一块存储空间,因而可以用于实现拆分数据的功能。
      定义共用体
      1.  union test                //定义test联合体   
      2.  {     
      3.    int office;             //整型成员office   
      4.    byte teacher[2];        //字节数组成员teacher   
      5.  }a,b;                     //定义同时说明a,b为test类型   
      6.                        //a,b变量的长度应等于test的成员中最长的长度,   
      7.                        //即等于teacher数组的长度,共2个字节。  


      要表示共用体可以用
      1.  a.office   
      2.  a.teacher[0]  
      3.  a.teacher[1]  


      如上,a.teacher[0]和a.teacher[1]其实就是拆分后的a.office
      如果我们让
      1.  a.office = 0xff00;      //即1111 1111 0000 0000   


      1.  a.teacher[0] == 0000 0000   
      2.  a.teacher[1] == 1111 1111   


      这样就实现了拆分数据的目的
      至于复原数据,就是这个操作的反过程
      完整代码如下(适用于Arduino)

      1.  #include <EEPROM.h>  
      2.   
      3.  union data   
      4.  {  
      5.    int a;  
      6.    byte b[2];  
      7.  } distance;  
      8.   
      9.  void setup()   
      10. {  
      11.   Serial.begin(9600);  
      12.   
      13.   //清空数据(每个地址都写0)  
      14.   for (int i = 0; i < 512; i++)  
      15.   {  
      16.      EEPROM.write(i, 0);   
      17.   }  
      18.     
      19.   //数据拆分  
      20.   distance.a = 32000;  
      21.   for(int i = 0; i < 2; i++)   
      22.   {  
      23.     EEPROM.write(i,distance.b);  
      24.   }  
      25.   
      26. }  
      27.   
      28. void loop()  
      29. {  
      30.   //数据还原  
      31.   for(int i = 0; i < 2; i++)  
      32.   {  
      33.     distance.b = EEPROM.read(i);  
      34.   }  
      35.   Serial.println(distance.a);  
      36.   delay(1000);  
      37. }  


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-7-30 12:25
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    3

    主题

    8

    帖子

    141

    积分

    大松子

    Rank: 2

    积分
    141
    QQ
     楼主| 发表于 2019-7-30 13:29:27 | 显示全部楼层
    这。。。。我的代码块。。。。。
    代码也可以在这里查看/下载
    https://gitee.com/TobbyLALALA/study/tree/master
    回复

    使用道具 举报

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

    本版积分规则

    热门推荐

    【干货帖】锂电池充电IC-TP4056电路设计详解
    【干货帖】锂电池充电IC-T
    首先,先介绍下TP4056。TP4056是一款完整的单节锂离子电池采用恒定电流/恒定电压线性
    【评测板】荔枝派Nano
    【评测板】荔枝派Nano
    荔枝派 Nano,开启你的极客之心。这是一款仅有2.54cm X 3.3cm大小的精致小板,相当于
    二氧化碳传感器在酿酒厂中的应用分析
    二氧化碳传感器在酿酒厂中
    酿酒就是利用酵母菌在无氧条件下,做无氧呼吸,产生酒精。在发酵生产中,酿酒酵母有
    什么是尘埃粒子计数器_尘埃粒子计数器使用技巧
    什么是尘埃粒子计数器_尘
    尘埃粒子计数器是用于检测空气尘埃粒子的粒径和粒子分布的特殊装置,最开始是由显微
    空气质量检测仪中PM2.5传感器以及温湿度传感器的应用
    空气质量检测仪中PM2.5传
    随着我国工业化和城镇化的快速发展对能源的消耗也逐渐增大,在这个现代化的过程中会
    Arduino开发之入门教程4教你设计智能风扇
    Arduino开发之入门教程4教
    教你设计智能风扇这一节从物理电路的连接上,增加了带直流电机的风扇;从编程上,增
    什么是大气飘尘_PM2.5传感器在大气飘尘检测中的应用
    什么是大气飘尘_PM2.5传感
    飘尘也就是可吸入颗粒物,是物质燃烧时产生的颗粒状浮动物质。飘尘颗粒直径小于10微
    签到送开发板,耗材大礼包
    签到送开发板,耗材大礼包
    电子工程师福利再次来袭,连续24天,每天送开发板和3份耗材大礼包,活动彩蛋还有多份
    【开发板申请】ESP8266物联网开发板申请
    【开发板申请】ESP8266物
    用你熟悉的方式 快速实现每一个想法Gokit3(S)是机智云(GizWit
    硬件经典面试100题(附参考答案)资料分享
    硬件经典面试100题(附参
    硬件经典面试100题(附参考答案)资料分享

    手机版|小黑屋|

    • CopyRight  2018-2018  松果社区   CopyRight discuz X3.3   
    快速回复 返回顶部 返回列表