位段(以32位int整数的机器为例)
概念:
C语言允许在一个结构体中以位为单位来指定成员所占内存的实际大小,这种以位为单位的成员我们称为
位段,位段是一种特殊的结构体,位段的声明和任何普通的结构体成员声明类似,如下:
Struct 位段结构体名
{
Unsigned 位段名:位段长度;
Unsigned 位段名:位段长度;
………………..
Unsigned 位段名:位段长度;
}位段结构体变量名;
但有两个例外,首先位段成员必须声明成int ,unsigned int, signed int,。其次,在成员的后面是一
个冒号和一个整数,这个整数指定该位段所占用位的个数。
位段使用时需要注意是:
位段结构体中的成员不能使用位段数组和位段指针,但结构体变量可以使数组或者指针,因为数组和指针都是以字节为单位的,同理也不能用&获取位段的地址。
例如:声明一个位段,我们先来分析一下他在计算机里面是如何存储的(一个无符号的int是4字节)。
struct tagAAA
{
unsigned int a : 1;
unsigned int b : 2;
unsigned int c : 6;
unsigned int d : 4;
unsigned int e;
}AAA_S;
由此我们可以明白位段的优点,本来定义了5个成员,需要5个存储单位,但是使用位段后只需要4个存储空间就足够了。
优点:
但它的成员是一个或多个位的字段,这些不同长度的字段实际上是存储于一个或多个整形变量中,他的优点是能够以较少的内存单元存储数据。位段可以用整形形式输出。
struct tagAAA
{
unsigned int a : 1;
unsigned int : 2;
unsigned int c : 6;
unsigned int d : 4;
unsigned int e;
}AAA_S;