【C语言】自定义类型——位段、枚举、联合体(进阶)

阅读导航:

1.位段

1.1什么是位段

1.2位段的内存分配

1.3位段的跨平台问题

2.4位段的应用

2.枚举

2.1枚举的定义

2.2枚举的大小

2.3枚举的优点:

2.4枚举的使用

3.联合(共用)

3.1联合的定义

3.2联合的特点

 3.3判断计算机当前的大小端存储

3.4联合体大小的计算


1.位段

1.1什么是位段

        位段的声明和结构体是类似的,但是有以下的几个不同:

        1.位段的成员类型必须是:int  、unsigned int 、signed int 、char ,不能是其他的变量类型,但是结构体没有的成员变量可以是任意类型。

        2.位段的成员名后面有一个冒号和数字(位段的“位”表示的意思是二进制位,这个数字表示的是占了多少个二进制位,也就是占了多少个比特位)

struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;

};

        A就是一个位段类型。

        对于任意的变量类型,函数…… 我们都能够从地址,大小,使用方法,内存占用去慢慢了解它。

        那么A的大小是多少呢?

int main()
{
	printf("%d",sizeof(struct A));
	return 0;
}

         为什么是8呢?

        理由:

        a b c d一共占用了2+5+10+30=47个比特位,1byte=8bit,那么至少申请了4个字节的空间(32比特位),还剩下的15(47-32=15)个比特位的数据没有存,那么只好再向内存申请4个字节的空间(因为a b c d 都是int类型的),因此占用了8个字节的空间。

        那么问题来了,假如我把位段改一下呢?

        看代码:

struct A
{
	int a  ;
	int b  ;
	int c : 10;
	int d : 10;

};
int main()
{
	printf("%d",sizeof(struct A));
	return 0;
}

        那么A到底是结构体还是位段呢?

        A的大小应该怎么算呢?

        其实是位段!!!只要成员的后面跟上了冒号和数字就是位段。

        先看答案:

         答案是A占用了12个字节的空间。

其实可以这样分析:        

        对于a b 都是int 类型的,并且a b后面并没有跟冒号和数字,那么就把a b堪称结构体的成员,a b占用的空间为8个字节。

        对于c d,c d后面跟了冒号个数字,那么可以看成位段的成员,c  d一共占用了20个比特位,又因为c d的类型都是int类型的,因此c d只需要向内存申请一个int类型的空间就足够存下20个比特位了。

        因此A的大小是12个字节。

        一般情况下,位段的成员里面是不能混用 char和int 类型变量的,是不建议使用的。

struct A
{
	char a:1  ;//不要这样使用位段
	char b: 1  ;//里面既有char又有int
	int  c : 7;//这样不好确定位段占用空间的大小,不利于设计
	int  d : 8;

};
int main()
{
	printf("%d",sizeof(struct A));
	return 0;
}

1.2位段的内存分配

        1.位段的成员是:int 、unsigned int、signed int、char类型

        2.位段上的空间是需要按照4个字节(int)或者一个字节(char)的方式开辟的

        3.位段涉及很多不确定性因素,位段是不可跨平台的,注重可移植性的程序应该避免使用位段。

        下面用一段代码来分析位段的空间是如何开辟的:

     

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};

int main()
{
	struct S s = { 0 };
	s.a = 10;
	s.b = 12;
	s.c = 3;
	s.d = 4;

	printf("%d",sizeof(struct S ));
	return 0;
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

待己以诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值