zoukankan      html  css  js  c++  java
  • 位域

    一、定义

          位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有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型变量的各位)仍然可行,可以编译以及运行,原来是跨字节之后,其排列顺利就会受到大小端的影响啊。看来位域的使用是两方面的,既可与大小端存储模式有关,也可无关。

  • 相关阅读:
    递归分治策略
    矩阵连乘问题
    棋盘覆盖问题
    选择排序
    Dijkstra的双栈算术表达式求值算法
    斐波那契数列
    二分算法
    Linux服务器上tengine的安装配置
    Excel Sheet Column Number
    Excel Sheet Column Title
  • 原文地址:https://www.cnblogs.com/zzj2/p/3026325.html
Copyright © 2011-2022 走看看