C中的位域
在数据存储时,有的时候我们不需要一个完整的字节来存储数据,只需要其中的一个或几个二进制位就可以完整的表达,特别是在嵌入式设备中,对内存中的管理尤其严格,因为在嵌入式设备中,内存是有限的,因此,需要程序员对内存进行严格管理,C语言中为了节省存储空间,提供了一种数据结构,即“位域” 或”位段“。
位域的定义与结构体的定义一样
如:
struct bit_fields{
int a:2;
int b:6;
int :0;
int d:5;
int e:4;
int f:3;
int g:5;
}data,*p_data;
注意:
1. 位域必须存储在同一个类型中,不能跨类型存储,也不能跨字节存储。如果一个字节余下的空间不够存储另外一个位域时,则应该从下一单元存放该位域
2. 位域的长度不能超过所定义的类型的长度
3. 如果位域是无名位域,且用来作为填充和调整的位置,则该位域不能被使用
4. 如果位域的长度为0,则表示该位域是空域,同时,下一个域则会从下一个字节单元开始存放
5. 取地址操作符&不能应用在位域字段上
6. 位域赋值时注意不要超过位域表示的范围
如:
#include<stdio.h>
struct bit_fields{
int a:2;
int b:6;
int d:5;
int :0; //无名空域,不能使用,从下一个字节单元开始
int e:4;
int f:3;
int g:5;
}data,*p_data;
int main()
{
data.a = 1; //表示范围为-2~1,注意赋值时不超过其范围
data.b = 31;
data.d = 5;
data.e = 5;
data.f = 3;
data.g = -8;
printf("data.a = %d data.b = %d data.d = %d data.e = %d data.f = %d data.g = %d \n",data.a,data.b,data.d,data.e,data.f,data.g);
p_data = &data;
printf("p_data = %p \n",&p_data);
printf("sizeof(data) = %ld\n",sizeof(data)); //位域大小
printf("sizeof(int) = %ld\n",sizeof(int));
printf("p_data->a = %d \n",p_data->a);
//printf("p_data->a = %p \n",&p_data->a); //不能对位域字段取地址操作
return 0;
}