结构体位段、枚举、联合体(共用体)

本文详细介绍了C语言中的位段、枚举和联合体(共用体)。位段允许以位为单位指定结构体成员长度,节省存储空间;枚举提供了一种命名整型常量的方式,增强代码可读性和维护性;联合体则允许不同类型的变量共享同一内存空间,用于特定算法实现。同时讨论了它们的声明、特点和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位段

什么是位段?

    位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。

位段的声明

   位段的声明和结构是类似的,有两个不同:

  1. 位段的成员必须是 int、unsigned int、 signed int、char 整形家族。
  2. 位段的成员后面有一个冒号和数字。
struct A
{
	int a : 2;         //这里的2是比特位
	int b : 5;
	int c : 10;
	int d : 30;
};

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

位段的大小

  1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
  2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
  3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。

枚举

数学计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。 [1]  是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

枚举类型的定义

    

enum Day            //枚举类型
{
    Mon,
    Tues,
    Wed,
    Thur,
    Fri,
    Sat,
    Sun             //枚举常量
};

枚举的优点

  1. 增加代码可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨
  3. 防止命名污染
  4. 便于调试
  5. 使用方便,一次性可以定义多个常量。

枚举类型变量只能使用枚举常量赋值。

联合(共用体)

   进行某些算法的C语言编程的时候,需要把几种不同类型的变量存放到同一段内存单元中。也就是利用覆盖技术,使几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构类型,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点。

联合类型的定义

 

union Un        //    联合类型
{
    char c;
    int i;
}

//联合变量的定义
union Un un;
//计算联合类型大小
printf("%d\n",sizeof(un));

联合类型的应用

        计算大小端

联合大小的计算

  • 联合的大小至少是最大成员的大小
  • 当最大的成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。         对齐数:默认对齐数和成员大小的较小值。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值