一、定义
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有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型变量的各位)仍然可行,可以编译以及运行,原来是跨字节之后,其排列顺利就会受到大小端的影响啊。看来位域的使用是两方面的,既可与大小端存储模式有关,也可无关。