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

我正在使用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; 

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

Solutions Collecting From Web of "位域的哪一端是最重要的位?"

C99标准6.7.2.1/10(重点矿):

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

所以,这个命令必须由你的编译器实现记录下来。

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

如果你想让你的'位域'为你的程序外部的东西建模(比如上面的东西),使用明确的掩码,使用标准的按位运算符( | ,'& ,, <<`等等。)。 使用助手内联函数(如果必须的话,甚至是宏),使代码更容易/更清晰。

Visual Studio 2008编译器文档指出:

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

从“C ++位域”,MSDN C ++语言参考,Visual Studio 2008版本

如果您询问myBitField中的哪些位存储在内存中的哪些位中,则C标准明确地未定义这些位。 你必须通过实验学习。 这可能是值得的,如果你正在做一些实际上很重要的事情,可以使用#define field1作为十六进制值(例如0x400x02 ),并将其放在你想要的地方。