在这里插入代码片
位字段(bit field),是一个signed int 或unsigned int 中一组相邻的位(c99还允许使用Bool类型位字段)。位字段由一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度。
一个重要的机器依赖性是将字段放置到一个int总的顺序。在有些机器上,这个顺序是从左向右,在另一些机器上顺序是从右向左。不同的机器在两个字段边界的位置上也有区别。因此,位字段往往难以移植。
struct {
unsigned int field1:1; //1位字段
unsigned int :2; //使用未命名字段来填充空段
unsigned int field2:1;
unsigned int :0;
unsigned int field3:2; //2位字段
}stuff;
C使用unsigned int 作为位字段结构的基本布局单元,因此,即使一个结构的唯一成员是1位字段,该结构的大小也与一个unsigned int 的大小相同,即32位。如果总的声明超过一个unsigned int,将会再开辟一个unsigned int存储空间。
#include <stdio.h>
/* */
typedef struct Buf
{
unsigned int a:1;
unsigned int b:2;
unsigned int :1;
unsigned int c:4;
}buf;
int main()
{
printf("%d\n",sizeof(buf));
/* 正常赋值 */
buf p = {1,3,15};
printf("p.a is:%d\n",p.a); //输出1
printf("p.b is:%d\n",p.b); //输出3
printf("p.c is:%d\n",p.c); //输出15
printf("************************\n");
/* 异常赋值 */
buf b = {2,7,17};
printf("b.a is:%d\n",b.a); //2,最后一位为0,输出0
printf("b.b is:%d\n",b.b); //7,最后两位为3,输出3
printf("b.c is:%d\n",b.c); //17,最后四位为1,输出1
return 0;
}
对位字段元素赋值时,该元素只截取相应位数上的值。