位域:
是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
#include<stdio.h>
typedef struct tagBit
{
unsigned char cBit1:2,
cBit2:4,
cBit3:9;
}BIT_S;
int main()
{
BIT_S stBit;
stBit.cBit1 = 3;
stBit.cBit2 = 15;
stBit.cBit3 = 5;
printf("%d-%d-%d", stBit.cBit1, stBit.cBit2, stBit.cBit3);
return 0;
}
问题扩展1:
如果赋值给位域的值超过了位域所能表示的最大值的时候结果如何呢,
结果应该是截断。
举例来说明:比如cBit1定义的位数为2,那么cBit1的最大值为11(10进制为3),如果赋值为5,那输出的结果应该为1,解释如下,5的二进制表示为101,赋值给cBit1后,cBit1只能获得两位的数值,所以cBit1的值只能为01(10进制为1)
问题扩展2:
如果将一个位域的变量定义的大小比8大结果会怎么样呢,
结果为编译不通过。
解释:
位域的定义是按照1个字节的位数来定义的,1个字节的位数为8,所以位域的定义最大应该为8。举例说明,如果把上边的cBit3定义为9,那编译器就会出告警了,以下是VC6.0的试验结果:
error C2034: 'cBit3' : type of bit field too small for number of bits
总结:
位域在平时中用的比较少,现在的内存比较大,都不会在乎这点空间。如果把情况放在嵌入式系统或者网络中就不一样了。就拿网络的来说吧,在网络传输中,少点数据肯定比多的要好,把一些标记为按照 位数 来定义,可以省不少空间。好比在TCP 报文中syn这些字段之类的,只有0或者1这两种情况,用普通的unsigned char 来表示也要1个字节,用1位来表示,节省了不少空间。
这就是本人对位域的理解,欢迎大家提意见。