c语言位域总结

有时我们存储信息时并不需要用到一个完整的字节,而只需要几个二进制位。C语言提供了一种数据结构,称为位域(位段)用于这种情况。

定义:

struct name{
    类型名 位域名:位域长度;   // 位域长度不能大于8(即一个字节) 
};

注意:
一个位域必须存储在同一个字节中,当有两个连续的位域,在一个字节中存放第一个位域后剩下的空间不足以存放第二个位域,则第二个位域将存放在一个新的字节中,前一个字节多余的未补0

struct bits{
	int a:4;   // 第一个字节 
	int b:5;   // 第二个字节 
};

我们也可以显式使得某个位域存放在一个新的字节中,即使用空域

struct bits{
    int a:4;  // 第一个字节 
    int :0;   // 空域 
    int b:2;  // 第二个字节 
}; 

当一个位域无位域名时,它只是用来作为填充或调整位置,不能被使用(int :4 仅仅是用来占4位)

位域变量的说明
与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:

struct bits{
	int a:8;
	int b:2;
	int c:6;
}data;

说明data为bits变量,共占2个字节。其中位域a占8位,位域b占2位,位域c占6位。

空域大小
空域所占大小和 a的类型及空域的类型二者皆相关。
1、a,空域皆为char时,二者共占据1字节;a 为unsigned,空域为unsigned; a 为char,空域为unsigned; a 为unsigned,空域为char;这三种情况,二者共占据4字节。
2、 位域的长度不能大于指定类型固有长度,比如说int的位域长度不能超过32,bool的位域长度不能超过8。
3、 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
 

struct k{
	int a:1
	int :2 /*该2位不能使用*/
	int b:3
	int c:2
};

 

位域使用

注意位域使用时,不用自己做偏移。这个偏移编译器会处理。

struct k{
	int a:4
	int :4 /*该4位不能使用*/
	int b:4
	int c:4
}data;

/*将结构体中a b c位分别置成5 7 3*/
data.a = 5;
data.b = 7;
data.c = 3;

 

你可能感兴趣的:(c语言位域总结)