Какой конец битового поля является самым значительным битом?

Я пишу приложение С++ для Windows XP/Vista/7 с помощью Visual Studio 2008. Некоторые из моих структур используют поле бит, как показано в примере.

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;

Какой конец поля является самым значительным битом?

Ответ 1

Стандарт C99 6.7.2.1/10 (основное внимание):

Реализация может выделять любой адресный блок хранения, достаточно большой для хранения битового поля. Если остается достаточно места, бит-поле, которое сразу следует за другим битовым полем в структуре, должно быть упаковано в соседние биты того же блока. Если недостаточно места, то будет ли бит-поле, которое не подходит, помещается в следующий блок или перекрывает смежные единицы, определяется реализацией. Порядок распределения бит-полей внутри устройства (от высокого порядка до низкого или низкого порядка) определяется реализацией. Выравнивание адресного блока хранения неуказано.

Итак, заказ должен быть документирован вашей реализацией компилятора.

Однако так много о том, как реализованы битовые поля, - это реализация, определенная или неопределенная, что использование их для моделирования битовых полей аппаратного, проводного протокола или формата файла в переносном режиме не стоит того, чтобы пытаться.

Если вы хотите, чтобы ваши "битовые поля" моделировали что-то внешнее по отношению к вашей программе (например, перечисленные выше), используйте явные маски, установив и очистив биты с помощью стандартных битовых операторов (|, '& , ~ , < < и т.д.). Используйте вспомогательные встроенные функции (или даже макросы, если необходимо), чтобы сделать это проще и понятнее в вашем коде.

Ответ 3

Если вы спрашиваете, какие биты в myBitField хранятся в битах байта в памяти, это явно undefined по стандартам C. Вам придется учиться на экспериментах. Вероятно, стоит, если вы делаете что-то там, где это имеет значение, вместо этого используйте подход, в котором вы #define field1 в качестве шестнадцатеричного значения (например, 0x40 или 0x02) и помещаете его туда, где хотите.