• C语言 段位


      C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”

      在结构体中位段的定义格式为:

    unsignede <成员名>:<二进制位数>;

    例如:

    struct bytedata{
        unsigned a:2;   /*位段a,占2位*/    
         unsigned b:6;   /*位段b,占6位*/    
    }data;

     引用结构体的位段成员同引用结构体其他类型成员一样,但应注意位段的最大取值范围不要超出二进制位数限制的范围,否则超出部分会丢失。

    例如:

    data.a = 2;  /*正确*/

    data.b = 10;/*错误,超出范围(a占2位,能容纳的最大值为3)*/

      关于位段,还需要注意以下几点:

    (1)位段成员的数据类型必须是unsigned.

    (2)可以定义长度为0的位段。这使下一位段从下一存储单元(一个存储单元一般是两个字节)开始。例如:

    struct bytedata{
        unsigned a:1;
        unsigned b:2;
        unsigned:0;
        unsigned c:3; 
    };

    本来a、b、c应连续存放在一个存储单元中,但由于用长度0的位段将b、c隔开,现只能将a、b存放在一个存储单元中,而c另存放在下一个单元中

    (3)位段不能跨单元存储,如果上一单元的剩余空间不够存储新的位段,则跳过此剩余空间,将该位段存放在下一个单元中

    (4)可以定义无名位段,但其空间不能使用。

    struct bytedata{
        unsigned a:1;
        unsigned:2;    /*无名位段,占2位,不能使用*/
        unsigned c:3;
    };

    (5)一个位段的长度不能大于一个存储单元的长度。

    (6)不能定义位段数组。

    (7)位段可以以%d、%u、%o、%x等格式输出。

    (8)位段若出现在表达式中,将被系统自动转换成整型数。

    位段排序:

        先定义先排序

  • 相关阅读:
    [BZOJ]1854: [Scoi2010]游戏
    [BZOJ]3531: [Sdoi2014]旅行
    2017-3-30校内训练
    Codeforces Round #407 (Div. 1)
    [BZOJ]1064: [Noi2008]假面舞会
    Educational Codeforces Round 18
    [BZOJ]1503: [NOI2004]郁闷的出纳员
    [BZOJ]1758: [Wc2010]重建计划
    2017-3-26四校联考
    [BZOJ]4644: 经典傻逼题
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5939004.html
Copyright © 2020-2023  润新知