结构体成员有冒号 位域 位段

参考的文档是:https://www.cnblogs.com/maowang1991/p/3656072.html

如下面的结构:

struct
{
unsigned char x1:1;
unsigned char x2:1;
unsigned char x3:1;
unsigned char x4:1;
unsigned char x5:1;
unsigned char x6:1;
unsigned char x7:1;
unsigned char x8:1;
}cn;

类型与结构体,但是他是位域,或者叫做位段操作。

这里面的成员如x1被定义为:unsigned char x1:1;

这里后面的冒号 :1代表的是x1占用了一位,而不是unsigned char。

 

为什么要用位域操作:

好处一节省空间,这个似乎没有特别大的作用,因为现在基本上不差这点内存。比如:可以用1位而不是用一个字节表示开关。

好处二分解变量,这个可以按照位,把变量分开。运算快,比较省事。

 

下面实验如果实现把变量按照位进行分解:

这里需要用到:union,也就是联合,

联合的好处就是里边的所有变量都用的是一个内存空间。

 

测试程序:

//所用的在线工具:https://www.it1352.com/Onlinetools/details/6 

//gcc 5.4.0

#include "stdio.h"

//下面这里是一个联合wy,
//里面 cn 变量和 s 变量用的是一个内存
//也就是改变一个,另一个也会改变
union wy { struct { unsigned char x1:1; unsigned char x2:1; unsigned char x3:1; unsigned char x4:1; unsigned char x5:1; unsigned char x6:1; unsigned char x7:1; unsigned char x8:1; }cn; unsigned char s; } tmp;

int main() { tmp.s =0xf0; //二进制形式是1111 0000 给s赋值,就是给cn赋值
//因为进行了联合。
printf("tmp.s is %d\n",tmp.s); printf("tmp.s is %x\n",tmp.s); printf("x1 is %d\n",tmp.cn.x1); printf("x2 is %d\n",tmp.cn.x2); printf("x3 is %d\n",tmp.cn.x3); printf("x4 is %d\n",tmp.cn.x4); printf("x5 is %d\n",tmp.cn.x5); printf("x6 is %d\n",tmp.cn.x6); printf("x7 is %d\n",tmp.cn.x7); printf("x8 is %d\n",tmp.cn.x8); return 0; }

输出的结果:

tmp.s is 240 
tmp.s is f0   //给s赋值 1111 0000
x1 is 0       //这里是低位
x2 is 0
x3 is 0
x4 is 0
x5 is 1
x6 is 1
x7 is 1
x8 is 1      //这里是高位

 因此就会把每一位的数据都展开,从而知道是0还是1.

posted @ 2020-04-26 18:49  GXTon  阅读(496)  评论(0编辑  收藏  举报