《位域》小结

  1. 位域

    位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位
    2 .位域定义

    与结构定义相仿,其形式为:
    struct 位域结构名
    {
    位域列表
    };
    其中位域列表的形式为: 类型说明符 位域名:位域长度
    例如:
    struct bs
    {
    int a:8; //一个字节
    int b:2; //一个字节前高6 bit
    int c:6; //字节的下2 bit
    };

先看个例子,测试一下位域结构体的大小:

#include<stdio.h>
int main()
{


    struct s1

    {
        int i:8;
        int j:4;
        int a:3;
         double b ;
    };

   printf("%d",sizeof(struct s1));
   return 0;
}

16
Press any key to continue

其实位于结构体也可以按平时所用的结构体,进行访问,赋值,
操作大同小异,不过现在操作的更小,bit而已。


#include<stdio.h>
main()
{
    struct bs
        {
             unsigned int a:1;
             unsigned int b:3;
             unsigned int c:4;
        } bit,*pbit;
    printf("%d\n",sizeof( struct bs));
    bit.a=1;
    bit.b=7;
    bit.c=15;
    printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
    pbit=&bit;
    pbit-> a=0;
    pbit->b &=3;    //双目运算符,从右到左 pbit -> b  = pbit->b & 3;
    pbit->c|=1;       //pbit -> c = pbit  -> c | 1; 
    printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}

运行结果:

4
1,7,15
0,3,15
Press any key to continue

干货: 这可能是笔试题中与内存对齐同等的题型

使用位域的主要目的是压缩存储,其大致规则为:

1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则有转化为内存对齐问题
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。


#include<stdio.h>
main()
{
     struct test1
     {
        char a:1;
        char :2;       //一个字节
                       //    + 3 字节
        long b:3;      // 4字节  类型不匹配,所以要进行内存对齐
        char c:2;       // 1字节  
                        //共9字节,但要自身内存对齐   所以为12,byte
     };
     printf("%d\n",sizeof(struct test1));

}


运行结果:


12
Press any key to continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值