c语言结构体中冒号表示位域

c语言结构体中冒号表示位域,第1张

c语言结构体中冒号表示位域 详细的分配规则及实例

参考结构体中的冒号用法,摘录部分重要内容如下:

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。

bit分配的位置
// 定义如下结构体:
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,二进制位置如下:

得到结论:在同一个位域类型内,位域分配从该字节的高位开始分配(注:常规意义上的高低位是以字节为单位,此处使用该方法是为了更方便说明)。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4752318.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-08
下一篇 2022-11-08

发表评论

登录后才能评论

评论列表(0条)

保存