今天在一个群里看到了这样一个题
typedef struct
{
unsigned char ucid:1;
unsigned char ucid1:2;
unsigned char ucid2:6;
unsigned char ucid3:4;
unsigned char ucid4;
unsigned char ucid5:4;
unsigned long ucid6;
} s ;
问 “:”是什么含义,看后我感觉没有见过,于是就上网查了一下。以下是我个人理解的,望大牛们来指正,教导。
以上其是一个“位域”,平常我们在使用struct定义的结构体的时候,我们知道有一些值是很小的,也就是说一些用来记录状态的变量,它们本不需要占那么几个字节,那么就有很多位空在那,没有用上,说白了就是浪费了。而位域就很好的结决了这个问题,其使能够很好的支配一个字节的存储空间。“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,答应在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
例如
struct k
{
unsigned int a:1 ;//表示a只用了1位2进制位
int :2 ;//没有名字的为空域,就是这2位不使用
unsigned int b:2 ;//表示b用两位
unsigned int c:3 ;//c用3位
} ;
int main ()
{
struct k kk ;
kk.a = 3 ;//======1位
kk.b = 5 ;//======2位
printf ( "%u,%u\n", kk.a,kk.b ) ;//结果是1, 1 ;
return 0 ;
}
还有一点就是如果你要存储的超出剩下的位数,则需要将整个位域移到下一个字节中定义,也就是说位域的位数超过八位。