C语言中使用联合体(共用体)实现位操作,在单片机开发中利用联合体(共用体)实现位操作

您所在的位置:网站首页 单片机结构体使用例子 C语言中使用联合体(共用体)实现位操作,在单片机开发中利用联合体(共用体)实现位操作

C语言中使用联合体(共用体)实现位操作,在单片机开发中利用联合体(共用体)实现位操作

2024-06-23 19:56| 来源: 网络整理| 查看: 265

      联合体(也叫共用体)是一种特殊的数据类型,可以实现在同一段内存中存储不同的数据类型,看到这个你是不是觉和结构体好像差不多,但是注意联合体的这个重要特性:联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员,联合体会进行内存覆盖,对其中一个成员赋值,就会把其他成员的值覆盖掉。而结构体的各个成员会占用不同的内存,互相之间没有影响,对一个成员赋值,其它成员保持自己的值不受影响。

  共用体也是一种自定义类型,可以用来创建变量:

union Data{ char c; int n; };//创建了一个名为 data 的共用体类型 union Data a, b, c; //定义了data类型的共同体变量 a,b,c; void main(){ a.n=22334455; a.c=11; printf("a.n=%d,a.c=%d",a.n,a.c); //这时可以将a.d、a.c的数值打印出来看到a.n=22334411,a.c=11 //我们看到a.n的值发生了变化是因为我们在a.n之后又对a.c进行了赋值 //于是a.c的值就将a.n的值最后一个字节给覆盖掉了 }

上面创建的联合体 Data 中,成员d 为double类型变量共占用 4 个字节,相较于成员c 占1个字节,成员n 占4个字节所以Data 类型的变量a、b、c 就占用 4 个字节的内存。从上面的程序中我们看到a.n的值发生了变化是因为我们在a.n之后又对a.c进行了赋值,于是a.c的值就将a.n的值最后一个字节给覆盖掉了。

      位操作在单片机开发中比较常用, 接下来我们利用联合体来实现位操作,首先我们知道结构体内存中是连续的,但是不需要是一个完整的字节,利用这样的特性我们可以进行很方便的实现位操作了。

typedef union { struct{ unsigned char bit0: 1; unsigned char bit1: 1; unsigned char bit2: 1; unsigned char bit3: 1; unsigned char bit4: 1; unsigned char bit5: 1; unsigned char bit6: 1; unsigned char bit7: 1;//位域声明语句,用于定义一个名为bit7的位域, //它占用1个位(bit)的空间 } bits; unsigned char byte; } BitUnion;//创建了一个名为BitUnion的联合体类型 BitUinon PIN0;//定义了BitUnion类型的联合体变量PIN0 void main(){ PIN0.bits.bit0=1; PIN0.bits.bit1=1; PIN0.bits.bit2=0; PIN0.bits.bit3=0; PIN0.bits.bit4=1; PIN0.bits.bit5=0; PIN0.bits.bit6=1; PIN0.bits.bit7=0; printf("PIN0.byte= %d ",PIN0.byte); //这时可以将 PIN0.byte 的数值打印出来看到 PIN0.byte=83 (83=0x53即二进制01010011的值) }

  这样我们就就实现了位操作了。如果我们要对2个字节的数据进行操作那就定义 16个位域的结构体即可实现,那么对4个字节的数据呢,以此类推就可实现啦。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3