• 位域


    一、定义

          位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

    二、例子

    1、

    struct bs
    {
        int a:8;
        int b:2;
        int c:6;
    }data;
    //说明data为bs变量,共占2个字节。其中位域a占8位,位域b占2位,位域c占6位。

    2、

    struct bs
    {
        int a:8;
        int :2;
        int c:6;
    }data;
    //说明data为bs变量,共占2个字节。其中位域a占8位,位域b占2位,位域c占6位。
    //没有位域名的位域字段是不能使用的,只是用来占位置。

    3、

    struct test1 {
        char    a : 2;
        char    b : 3;
        char    c : 1;
    };
    其大小为1 bytes,a和b和c在一个char中。

    4、

    struct test2 {
        char    a : 2;
        char    b : 3;
        char    c : 7;
    };
    其大小为2 bytes,a和b在一个char中,c在第二个char中。

    5、

    struct test3
    {
        char a:1;
        char :2;
        long b:3;
        char c:2;
    };
    其大小为12bytes。如果相邻的位域字段的类型不同,在不同的位域类型间,按通用的对齐规则进行不同数据类型间的对齐(注意,struct的长度是其内部最宽类型的整数倍)

    6、

          位域一般情况下是不受字节序影响的,但有例外,就是位域元素跨字节,在不同的编译环境下有不同的表现。
    所以,在使用位域时,有两个要遵循的,
    一是位域元素不要超过八位。
    二是位域元素不要跨字节,否则,有的环境是允许它跨字节,有的会把它移到下一单元。
    像十八位长的元素,绝对是要避免使用的。

          在C教材中看到过警示:不要使位域超过8位,但定义多位的位域(我曾定义过64位的位域,用于提取double型变量的各位)仍然可行,可以编译以及运行,原来是跨字节之后,其排列顺利就会受到大小端的影响啊。看来位域的使用是两方面的,既可与大小端存储模式有关,也可无关。

  • 相关阅读:
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    C语言博客作业06--结构体&文件
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
    DS博客作业05--树
    DS博客大作业--树 (陈梓灿组)
    DS博客作业03--栈和队列
  • 原文地址:https://www.cnblogs.com/zzj2/p/3026325.html
Copyright © 2020-2023  润新知