在C语言中,我们可以利用结构体实现位段的功能。位段的声明和结构类似,但是它的成员是一个或者多个位的字段。这些不同长度的字段实际上存储在一个或者多个整型变量中。
位段的声明和任何普通的结构成员声明相同,但有两个例外:第一、位段成员必须声明为int、signed int、unsigned int类型。第二、在成员名的后面是一个冒号和一个整数,这个整数用于指定该位段所占用的位的数目。例如下面是一个位段声明的例子:
struct CHAR{
unsigned ch : 7;
unsigned font : 6;
unsigned size : 19;
};
许多16位整数机器的编译器会把这个声明标识为非法,因为最后一个位段的长度超过了整型的长度。但是在32位的机器上,则可能有两种情况。
需要注意的是,注重可移植性的程序应该避免使用位段。原因如下:
- int位段被当作有符号数还是无符号数
- 位段中位的最大数目,许多编译器把位段成员的长度限制在一个整数值的长度之内,所以一个可以运行在32位整数的机器上的位段声明可能在16位整数对的机器上无法运行。
- 位段中的成员在内存中是从左往右分配还是从右往左分配的。
- 当一个声明指定了两个位段,第2个位段比较大,无法容纳于第一个位段剩余的位时,编译器有可能把第2个位段放在内存的下一个字,也可能直接放在第一个位段的后面,从而在两个内存位置的边界上形成重叠。