/*
位字段:C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成
员所占的位数。
位字段和结构体密切相关,只会出现在结构体中,元素类型只能时int或者unsigned int
*/
#### 位字段赋值原则 ####
位字段:C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成
员所占的位数。
位字段和结构体密切相关,只会出现在结构体中,元素类型只能时int或者unsigned int
*/
#### 位字段定义和在内存中开辟空间原则 ####
C代码:bit_word_1.c
#include <stdio.h>
struct data
{
//位字段定义: 变量:所占位数
unsigned a:3;//元素只占一个wrod里面的3个bit,所以取值范围0~7
unsigned b:2;//元素只占一个word里面的2个bit,所以取值范围0~3
};
int main(void)
{
struct data d1;
//实例化一个变量d1:内存开辟空间原则:当成员变量a是unsigned int型,开辟四个字>节空间,但是a只会占3bit,仍有29位空余;第二个成员变量b只占2bit,因之不用在开辟下一个四>字节空间。这种思想主要用于一些使用空间很宝贵的程序设计中
printf("sizeof(d1) = %d \n",sizeof(d1));
return 0;
}
#### 位字段赋值原则 ####
/*
位字段变量赋值时,一定要注意该变量占几个bit位,(如果不是unsigned型,还要注意最高位标示符号位);赋值不能超过能表示的范围
*/
C代码:bit_word_2.c
#include <stdio.h>
struct data
{
unsigned int a:3;
int b:2;
int c:30;//上面两个成员占用5bit位,所以上一个4字节不够给c分30bit,故应该重新开
辟4字节空间
unsigned int d:3; //同理,上一个4字节占了30bit,也不够分出3bit,故重新开辟4字>节空间
int :3; //无名字段,只是用来占大小,不可访问;上一个4字节占用了3bit,可以给之>分配3bit
int :0; //0字段,把word里剩余的bit位写0,同样上一个4字节占用了3+3=6bit位,也有
剩余bit写0
unsigned e:7;//上一个4字节被全部写0,重新开辟4字节空间存放e
};
int main(void)
{
struct data d;
printf("sizeof(d) = %d \n",sizeof(d));
//成员变量a,b占四个字节;c占四个字节;d,无名字段,0字段占四个字节;e占四个字>节
struct data *p = &d;
p->a = 6;
// p->b = 5;
//warning: overflow in implicit constant conversion 因为成员变量b只占2bit,所>以它的取值范围-1~1,故赋值为5会有警告,如果赋值超过范围,结果不可预期。
printf("p->a = %d \n",p->a);
printf("p->b = %d \n",p->b);
return 0;
}