在介绍完结构体后,我们又要开始学习其他自定义类型了,还没有看结构体的铁子们可以先看看结构体哦
LETS GO!
位段
位段的声明与结构体是类似的,但是有两个不同
1.位段的成员必须是int,unsigned int,unsigned int,short(整型相关的数据类型)
2.位段变量有一个冒号和一个数字
位段的声明

变量后面的数字,单位是bit
与结构体一样,当计算整个位段的大小时,也存在内存对齐
例如上图的结构

我们知道了字段后面的数字对应的是bit,所以共有15bit,一个字节8bit,所以要2字节 才能存储下,但由于内存对齐,大小必须是结构中最大对齐数的整数倍,结构中最大对 齐数是4(int),所以此结构的大小要对齐到4
但同时,我们也注意到了一个问题,前三个变量的位段的大小为7bit,一个字节是8bit,
那么这剩余的一个空间是留给后面的字段继续使用还是将其舍弃掉呢?
答案:我也不知道
对于位段剩余得空间是否需要利用,和其地址是从左向右存储还是从右向左存储,这都 是不确定的,我们依然将锅扔给编译器
当然我们可以在VS2022编译器下查看他的地址存储的方法
如上图所述,当把二进制转换为16进制时,分别为1a 01

这时,我们便知道了在VS2022编译器下位段的存储规则
1.位段是从右向左存储的
2.当位段的个数小于一个8bit位时,剩余的空间会被下面的位段继续使用,不会浪费

不过前面也说到,位段存储空间不足时是浪费还是继续使用是不确定的,取决于编译器
在VS2019中,当存储空间不足时,编译器就会将其舍弃,开辟一个新的字节大小空间
位段的跨平台问题
1.int位段被当成有符号还是无符号的是不确定的
2.当位段存储空间不够时,是浪费剩余的空间还是继续使用是不确定的
3.位段中能确定的最大数目是变化的(32机器上最大就是32,64机器上就是64,如果你在16 位机器上写了26,那么就会报错)
4.位段成员的在内存中从左向右分配还是从右向左分配是不确定的
故特性导致了位段在本质上是不可移植的
枚举(enum)
定义
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量。,它可以让数据更 简洁,更易读。
枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。
声明


不难发现,枚举中的变量当以整型打印时,第一个值的初始值是0,后面的变量依次加1
但当你将第一个变量赋值后,随后的变量会根据你赋值的依次加1

当你在中间赋值时,赋值后的变量依次加1,赋值前的变量还是默认赋值

枚举的好处
#define也可以定义常量啊,为啥要用enum呢?
1.增加代码的可读性和可维护性
2.相较于#define定义的标识符,enum有着类型检查,更加严谨
3.可以一次定义多个变量,且便于调试
联合体(共用体)
定义
联合体也是一种特殊的自定义类型,他的独特之处是所有成员公用一块空间(所以也叫共用体)
声明



由此看出,联合体的成员是共用一块空间的,他们的地址都一样,且改变一个变量时,另一个变 量的值也会随之改变,故在联合体中,不能同时改变两个联合体变量的值
计算联合体大小

可以看到,char类型数组有5个字节,int类型有4个字节,因为联合体空间是共用的,所以我们取较大值,当然,在联合体中也存在内存对齐,大小位变量中最大对齐数的整数倍,这里的变量最大对齐数是int字节,所以此联合体的大小为8
小结:
上面就是此次自定义类型之位段枚举联合体的讲解,其中包含的细节还是比较多的,及时总结和归纳,希望本博客能帮助到大家,咱们下次见!
位段、枚举与联合体:C语言自定义类型的深入解析
本文介绍了C语言中的位段、枚举和联合体三种自定义类型。位段类似于结构体,但成员必须是整型,其存储和内存对齐有特定规则,且跨平台性差。枚举提供了一种定义离散常量的方式,增强了代码的可读性和维护性。联合体则允许所有成员共享同一块内存空间,改变一个成员会影响到其他成员。文章强调了这些类型的使用细节和潜在的平台依赖性。
9011

被折叠的 条评论
为什么被折叠?



