C语言中的位域

来源:互联网 发布:小米手机清空所有数据 编辑:程序博客网 时间:2024/05/06 09:23

今天在一个群里看到了这样一个题

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 ;}

还有一点就是如果你要存储的超出剩下的位数,则需要将整个位域移到下一个字节中定义,也就是说位域的位数超过八位。




原创粉丝点击