位域的哪一端是最重要的位?

Jim*_*ell 13 c windows visual-studio-2008 bit-fields

我正在使用Visual Studio 2008为Windows XP/Vista/7编写C++应用程序.我的一些结构使用位字段,如示例所示.

typedef struct myStruct_tag
{
    BYTE myVar1;
    WORD myVar2;
    WORD myVar3;
    union
    {
        struct
        {
            BYTE           :1;
            BYTE field1    :1;
            BYTE field2    :1;
            BYTE reserved  :5;
        } myBitField;
        BYTE myVar4;
    };
    BYTE myVar5;
    BYTE myVar6;
} myStruct_t;
Run Code Online (Sandbox Code Playgroud)

该领域的哪一端是最重要的位?

Mic*_*urr 22

C99标准6.7.2.1/10(强调我的):

实现可以分配足够大的任何可寻址存储单元来保持位域.如果剩余足够的空间,则紧跟在结构中的另一个位字段之后的位字段将被打包到相同单元的相邻位中.如果剩余的空间不足,则是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的.单元内的位域分配顺序(高阶到低阶或低阶到高阶)是实现定义的.未指定可寻址存储单元的对齐.

因此,订单必须由编译器实现记录.

然而,如何实现位域是实现定义的还是未指定的,使用它们以便携方式对硬件,线程协议或文件格式位字段建模并不值得尝试.

如果你希望你的'位字段'为你的程序外部建模(比如上面的东西),使用显式掩码,使用标准的逐位运算符(|'&,,<<`等)设置和清除这些位. .使用帮助器内联函数(如果必须,甚至使用宏)可以使代码更容易/更清晰.

  • +10,如果可以的话.你对这个问题的回答是不使用位域的最佳理由,因为人们认为它们对于它们有用. (2认同)

rak*_*ice 6

Visual Studio 2008编译器文档指示:

声明为位字段的数据排序是从低位到高位

来自"C++ Bit Fields",MSDN C++语言参考,Visual Studio 2008版本