一、定义

      位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

二、例子

1、

struct bs
{
    int a:8;
    int b:2;
    int c:6;
}data;
//说明data为bs变量,共占2个字节。其中位域a占8位,位域b占2位,位域c占6位。

2、

struct bs
{
    int a:8;
    int :2;
    int c:6;
}data;
//说明data为bs变量,共占2个字节。其中位域a占8位,位域b占2位,位域c占6位。
//没有位域名的位域字段是不能使用的,只是用来占位置。

3、

struct test1 {
    char    a : 2;
    char    b : 3;
    char    c : 1;
};
其大小为1 bytes,a和b和c在一个char中。

4、

struct test2 {
    char    a : 2;
    char    b : 3;
    char    c : 7;
};
其大小为2 bytes,a和b在一个char中,c在第二个char中。

5、

struct test3
{
    char a:1;
    char :2;
    long b:3;
    char c:2;
};
其大小为12bytes。如果相邻的位域字段的类型不同,在不同的位域类型间,按通用的对齐规则进行不同数据类型间的对齐(注意,struct的长度是其内部最宽类型的整数倍)

6、

      位域一般情况下是不受字节序影响的,但有例外,就是位域元素跨字节,在不同的编译环境下有不同的表现。
所以,在使用位域时,有两个要遵循的,
一是位域元素不要超过八位。
二是位域元素不要跨字节,否则,有的环境是允许它跨字节,有的会把它移到下一单元。
像十八位长的元素,绝对是要避免使用的。

      在C教材中看到过警示:不要使位域超过8位,但定义多位的位域(我曾定义过64位的位域,用于提取double型变量的各位)仍然可行,可以编译以及运行,原来是跨字节之后,其排列顺利就会受到大小端的影响啊。看来位域的使用是两方面的,既可与大小端存储模式有关,也可无关。