参考结构体中的冒号用法,摘录部分重要内容如下:
使用位域的结构体大小计算1、位域必须存储在同一个类型中,不能跨类型,同时也说明位域的长度不会超过所定义类型的长度。如果一个定 义类型单元里所剩空间无法存放下一个域,则下一个域应该从下一单元开始存放。例如:所定义的类型是int类型,一共32为,目前用掉了25位还剩下7位,这时要存储一个8位的位域元素,那么这个元素就只能从下一个int类型的单元开始而不会在前面一个int类型中占7为后面的int类型中占1位。
2、如果位域的位域长度为0表示是个空域,同时下一个域应当从下一个字节单元开始存放。
3、使用无名的位域来作为填充和调整位置,切记该位域是不能被使用的。
4、位域的本质上就是一种结构体类型,不同的是其成员是按二进制位来分配的。
分别定义如下两个结构体:
typedef struct { unsigned field_1 : 2; unsigned field_2 : 2; } header_1_t; typedef struct { unsigned char field_1 : 1; unsigned char field_2 : 2; } header_2_t;
其中 sizeof(header_1_t) == 4, sizeof(header_2_t) == 1。
因为 header_1_t.field_1 即使只占用了2bit,但是其占用了一个 unsigned int 变量的2bit。
// 定义如下结构体: typedef struct { unsigned char f_1 : 2; unsigned char f_2 : 3; unsigned char f_3 : 2; unsigned char f_4 : 1; } header_t; // 声明该类型变量并赋值: header_t hdr; hdr.f_1 = 3; hdr.f_2 = 2; hdr.f_3 = 1; hdr.f_4 = 0; // 取hdr首字节 unsigned char * first_byte = (unsigned char*)&hdr;
*first_byte = 43,二进制位置如下:
得到结论:在同一个位域类型内,位域分配从该字节的高位开始分配(注:常规意义上的高低位是以字节为单位,此处使用该方法是为了更方便说明)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)