C语言中的位域

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

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值