位段
什么是位段?
位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。
位段的声明
位段的声明和结构是类似的,有两个不同:
- 位段的成员必须是 int、unsigned int、 signed int、char 整形家族。
- 位段的成员后面有一个冒号和数字。
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;
}
位段的大小
- 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
- 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
- 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
枚举
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。 [1] 是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
枚举类型的定义
enum Day //枚举类型
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun //枚举常量
};
枚举的优点
- 增加代码可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨
- 防止命名污染
- 便于调试
- 使用方便,一次性可以定义多个常量。
枚举类型变量只能使用枚举常量赋值。
联合(共用体)
进行某些算法的C语言编程的时候,需要把几种不同类型的变量存放到同一段内存单元中。也就是利用覆盖技术,使几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构类型,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点。
联合类型的定义
union Un // 联合类型
{
char c;
int i;
}
//联合变量的定义
union Un un;
//计算联合类型大小
printf("%d\n",sizeof(un));
联合类型的应用
计算大小端
联合大小的计算
- 联合的大小至少是最大成员的大小
- 当最大的成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。 对齐数:默认对齐数和成员大小的较小值。