C语言位段位域

位段:位域

直接来看几个结构体,猜测一下他们的大小都应该是多少?

我们先来分析一下:

对于第一个结构体Date而言,int类型是四个字节也就是32个位,而我们这里只是对int类型,分了位域,也就是只用到了一个int类型,所以struct Date的大小就是4。

对于第二个结构体X而言,char类型是一个字节也就是8个位,char a 占了三个位,char b 占了二个位,那对于此时的char而言就只剩下了三个位,而char c 要占五个位,所以要再占一个字节,最终struct X的大小就是2。

对于第三个结构体Y而言,char类型是一个字节也就是8个位,char a 占了三个位,char b 占了四个位,char c 要占一个位,刚好把char的位占满,所以此时struct Y的大小就是1+1+2+4=8。

对于第四个结构体A而言,char类型是一个字节也就是8个位,char a 占了三个位,char b 占了二个位,那对于此时的char而言就只剩下了三个位,而char c 要占五个位,所以要再占一个字节,char d 要占四个位,上一个char c留下的三个位不够,所以又要再占一个char,最终struct A的大小就是3。

#include<stdio.h>
struct Date
{
	unsigned int year:23;       //23位二进制位
	unsigned int month:4;      //1-12   4位二进制位
	unsigned int day:5;       //1-31     5位二进制位
};

struct X
{
	char a:3;
	char b:2;
	char c:5;
};

struct Y
{
	char a:3;//char:数字不能大于8
	char b:4;
	char c:1;
	short e;
	int d;
};

struct A
{
	unsigned char a:3; //无符号的char类型,应该占一个字节八个位,但是此处用到了位域,所以a只占了三个位
	char b:2;  //char类型,应该占一个字节八个位,但是此处用到了位域,所以b只占了二个位
	unsigned char c:5;//无符号的char类型,应该占一个字节八个位,但是此处用到了位域,所以c只占了五个位
	char d:4;//char类型,应该占一个字节八个位,但是此处用到了位域,所以d只占了四个位
};
int main()
{
	printf("%d\n", sizeof(Date));
	printf("%d\n", sizeof(X));
	printf("%d\n", sizeof(Y));
	printf("%d\n", sizeof(A));
	return 0;
}

调试结果如下:

 和我们上边分析的结果一致。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值