zoukankan      html  css  js  c++  java
  • 位域

    注意:基本数据类型的位数与系统有关,比如64-bit系统的int型为4B

    C/C++中以一定区域内的位(bit)为单位来表示的数据成为位域,位域必须指明具体的数目。

    位域的作用主要是节省内存资源,使数据结构更紧凑。

    1. 一个位域必须存储在同一个字节中,不能跨两个字节,故位域的长度不能大于一个字节的长度。

    如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。

    struct testLen2{
            char a:2;
            char :3;
            char b:7;
            long d:20; //4bytes
            char e:4;
            }len2;
        printf("sizeof(len2)=%dn",sizeof(len2)); 8B on 64-bit OS
    struct testLen2{
            char a:2;
            char :3;
            char b:7;
            long d:20; //4bytes
            char e:4;
            }len2;
        printf("sizeof(len2)=%dn",sizeof(len2)); //4B
    总长为8,2+3 占1byte,b占1bye 由于与long对其,2+3+7 占4字节,后面 d 与 e进行了优化 占一个8字节
    
    

    2. 取地址操作符&不能应用在位域字段上;

    3. 位域字段不能是类的静态成员;

    4. 位域字段在内存中的位置是按照从低位向高位的顺序放置的;

    5. 位域的对齐

    1. 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

    2. 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

    3.如果相邻的两个位域字段的类型不同,则各个编译器的具体实现有差异,VC6采取不压缩方式,GCC和Dev-C++都采用压缩方式;

    4. 整个结构体的总大小为最宽基本类型成员大小的整数倍。

    5. 如果位域字段之间穿插着非位域字段,则不进行压缩;(不针对所有的编译器)

    参考示例:

    #include <stdio.h>
    struct bs
    {
    unsigned  char a:2;
    unsigned char b:2;
    unsigned char :4;
    } bit,*pbit;
    int main(){
    bit.a=3;
    bit.b = 2;
    
    printf("%d %d
    ",bit.a, bit.b);
    pbit=&bit;
    pbit->a &= bit.a;
    pbit->b &= bit.a;
    printf("%d %d
    ",pbit->a, pbit->b);
    
    return 0;
    }
    View Code

    参考:

    1. 段位域

    2. 位域 原文部分讲解有误。

  • 相关阅读:
    php的webservice的soapheader认证问题
    训练与解码
    ajax 图片上传
    js倒计时
    数据分析有价值的博客
    [Luogu P5675][GZOI2017]取石子游戏
    [BZOJ4558/LOJ2025/Luogu3271][GZOI2016/JLOI2016/SHOI2016]方
    [BZOJ4557/LOJ2024/Luogu3267][GZOI2016/JLOI2016/SHOI2016]侦察守卫
    PKUWC2019游记
    随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/7239963.html
Copyright © 2011-2022 走看看