【每日一C之十六】C语言位字段

每日一C之位字段

       每天一个C语言贝壳厚积薄发积跬步以致千里

 今日贝壳:C语言位字段的解析与用法
               存储空间很宝贵的情况下,可以考虑利用C语言位字段多个数据保存在一个机器字。机器字指计算机一次能处理数据的bit位数,一般所说的32位系统即指其机器字长为32bit。
           1.定义位字段:C语言位字段定义方法:
                     struct   {
                              unsigned int a  : 1;      //冒号“:”后的数字为该位字段所占的bit位数
                              unsigned int b  : 3;      
                              unsigned int c  : 5;
                      }flags;
            上面定义了一个flags变量,包含a,b,c三个位字段。位字段只能定义为以下3中类型:
                      1.int 
                      2.signed int
                      3.unsigned int
           需要提醒的是,位字段的赋值要特别小心范围,如unsigned int型flags.b只占3个位数,范围在000-111即0-7,超出范围会出现不可预知错误。
           2.位字段访问
                      1.位字段通过“.”号访问:flags.a  ,  flags.b等等。
                      2.位字段没有独立的地址,不能进行取址操作。
                      3.位字段没有独立的存储空间,不能进行sizeof()操作。
           3.内存分配规则
                      1.位字段按声明顺序在机器字内存储
                      2.位字段不能跨越机器字存储,上一个机器字空间不足时,该位字段将全部存到下一个机器字
标准示例程序
#include
    
    
     
     
struct
{
	unsigned a  :20;
	unsigned b  : 6;
	unsigned c  : 2;
}flags;       //20+6+2<32(一个机器字的位宽)故可在1个机器字内存储
struct
{
	unsigned d  :20;
	unsigned e  :6;   //32-(20+6)=6该机器字剩余6bit
	unsigned f  :20;  //6bit不够存储f,f将在下一个机器字边界开始存储
}flagscopy;  //20+6+20>32(一个机器字的位宽)故需在2个机器字内存储
int main(){

	flags.c=3;             //位字段初始化与使用     
	printf("Flags.c is : %d \n",flags.c);

	int n=sizeof(flags);   //flags占一个机器字,sizeof为4
	printf("Size of flags :%d\n",n);
	
	n=sizeof(flagscopy);   //flagscopy占两个机器字,sizeof为8
	printf("Size of flagscopy :%d\n",n);
	return 0;
}

    
    
                  4.无名字段与0字段       
              struct   {
                              unsigned int   a  : 1;      
                              unsigned int       : 3;      //无名字段,不可访问,仅起占位作用
                              unsigned int       : 0;      //0字段,下一个位字段在新机器字边界
                              unsigned int    b : 7;
                          }flags;
              受0字段作用, 位字段flags.b将在下一个机器字边界开始存储。
                      
                     Have a nice day !
  
        
  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值