1 #include "stdio.h" 2 3 struct { 4 unsigned char a:3; 5 unsigned char b:3;
unsigned char c:4;
6 }i;
7 8 int main() 9 { 10 i.a = 1; 11 i.b = 2; 12 printf("a=%lu", sizeof(i)); 13 }
红色代码忽略的话,以上代码输出结果为:a=1, 至少要占一个字节。
================
红色代码不忽略的话,以上代码输出结果为:a=2, 总共10bit,超过了1个字节。所以要用2个字节。
===================
使用位域操作的好处是,不用手动进行移位操作,但是效果跟使用移位操作是一样的。代码简明了很多。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
位域操作还要注意的一点是,a b c在实际的存储中的排列方式,是把第一个声明的a,排在低位字节还是高位字节?假设a、b存储在低位字节,c存储在高位字节。在同一个字节里面,a是存储在字节的高位部分还是低位部分?
这个在不同的体系结构上面都是不同的。我的mac是x86-64的,存储的方式是:
a与b存储在低字节,c存储在高字节。然后在低字节中,a存储在低4位,b存储在高4位的。