在一番的查资料后了解到,这里使用了C语言中的位域(bit-field)分表表示给每个变量赋值长度为2bit或8bit的长度的内存空间。 让我们再次看到结构体下面的联合体(union)中定义的内容,这里有一个结构体定义的变量Bits以及一个uint8_t型的数组_c,由union的定义可知,这两个成员变量指向的是内存中的同一片区域,也就...
使用位域的主要目的是节约存储空间,可能某些情况下成员变量只能取几个值,那么则不需要使用一个字节甚至更大的空间去存放它。 举个例子,在上面的结构体 bits 中,qos 这个成员变量只能取0,1,2这三个值,那么我们可以在其定义后面加: 2来表示其只占用2 bit 的内存,故取值范围是[0, 3],满足我们的要...
3. 联合体使用 继续上代码 #defineTALL (1 << 0)#defineRICH (1 << 1)#defineHUMOR (1 << 2)@interfacePerson(){struct{// 位域名 : 位域长chartall:1;// 是否高charrich:1;// 是否富有charhumor:1;// 是否幽默}myself;// char _my;union{charbits;// 增加代码的可读性,相对于这个联合体...
联合体和位域的基本概念参考互联网,这种做法适合进行用在硬件寄存器操作的和通信协议栈管理上,可以很大程度的提高程序的可靠性和可阅读性。例如将单片机的每个寄存器定义成这种方式之后就可以使用运算符“.”对寄存器进行操作而不是使用易错难懂的类似“reg1 &= ~(1 << 8);”的与或操作(位带操作)。详细见下面的...
联合体在不同的系统或者cpu中的对齐方式不一样, union { char uchar; char bit1:1; char bit2:1; char bak:6; }udata; 该联合体中,直接对bit1进行赋值,不会改变uchar的值,对齐的原因。 如果改为 union { char uchar; struct{ char bit1:1; ...
结构体、联合体、位域融合,巧妙灵活使用 参考地址:http://www.51hei.com/bbs/dpj-39303-1.html 1typedef union2{3__u32 dwval;//这里是对寄存器整体赋值修改4struct5{6__u32 io_map_sel :1;//default: 0;7__u32 res0 :29;//default: ;8__u32 tcon_gamma_en :1;//default: 0;9__u32...