C语言从零开始——位字段

/*
        位字段:C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成
员所占的位数。
        位字段和结构体密切相关,只会出现在结构体中,元素类型只能时int或者unsigned int
*/

####   位字段定义和在内存中开辟空间原则   ####

C代码:bit_word_1.c

#include <stdio.h>
struct data
{
        //位字段定义: 变量:所占位数
        unsigned a:3;//元素只占一个wrod里面的3个bit,所以取值范围0~7
        unsigned b:2;//元素只占一个word里面的2个bit,所以取值范围0~3
};

int main(void)
{
        struct data d1;
        //实例化一个变量d1:内存开辟空间原则:当成员变量a是unsigned int型,开辟四个字>节空间,但是a只会占3bit,仍有29位空余;第二个成员变量b只占2bit,因之不用在开辟下一个四>字节空间。这种思想主要用于一些使用空间很宝贵的程序设计中
        printf("sizeof(d1) = %d \n",sizeof(d1));
        return 0;
}

####   位字段赋值原则   ####

/*

位字段变量赋值时,一定要注意该变量占几个bit位,(如果不是unsigned型,还要注意最高位标示符号位);赋值不能超过能表示的范围

*/

C代码:bit_word_2.c

#include <stdio.h>

struct data
{
        unsigned int a:3;
        int b:2;
        int c:30;//上面两个成员占用5bit位,所以上一个4字节不够给c分30bit,故应该重新开
辟4字节空间
        unsigned int d:3; //同理,上一个4字节占了30bit,也不够分出3bit,故重新开辟4字>节空间
        int :3; //无名字段,只是用来占大小,不可访问;上一个4字节占用了3bit,可以给之>分配3bit
        int :0; //0字段,把word里剩余的bit位写0,同样上一个4字节占用了3+3=6bit位,也有
剩余bit写0
        unsigned e:7;//上一个4字节被全部写0,重新开辟4字节空间存放e
};

int main(void)
{
        struct data d;
        printf("sizeof(d) = %d \n",sizeof(d));
        //成员变量a,b占四个字节;c占四个字节;d,无名字段,0字段占四个字节;e占四个字>节

        struct data *p = &d;
        p->a = 6;
//      p->b = 5;
        //warning: overflow in implicit constant conversion 因为成员变量b只占2bit,所>以它的取值范围-1~1,故赋值为5会有警告,如果赋值超过范围,结果不可预期。

        printf("p->a = %d \n",p->a);
        printf("p->b = %d \n",p->b);
        return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值