LALALA 发表于 2019-7-31 22:13:22

共用体(union)学习笔记

本帖最后由 LALALA 于 2019-7-31 22:16 编辑

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


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

要表示共用体可以用1.a.office    2.a.teacher3.a.teacher

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

则1.a.teacher == 0000 0000    2.a.teacher == 1111 1111   

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

1.#include <EEPROM.h>2.    3.union data   4.{5.    int a;6.    byte b;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. }


gada888 发表于 2019-8-1 09:47:43

很好的分享

LALALA 发表于 2019-7-31 22:17:55

这。。。。自己搞的代码块翻车了。。。。
代码也可以在这里查看/下载
https://gitee.com/TobbyLALALA/study/tree/master
页: [1]
查看完整版本: 共用体(union)学习笔记