2010-12-28 1 views
11

Я пишу приложение C++ для 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; 

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

+2

Примечание: В соответствии со стандартом, MSB не определен. На вашей конкретной платформе я подозреваю, что 'reserved' содержит MSB, но я не уверен. –

+0

@Billy: Это похоже на ответ. –

+0

Er ... Это довольно странный вопрос. У вас есть только 3 битовых поля в объявлении. 2 из них являются 1-битными битовыми полями, т. Е. С ними не возникает «какой конец», так как там всего 1 бит. Единственное многобитовое битовое поле под названием «зарезервировано», которое предполагает, что оно вообще не используется. Итак, в основном, единственным полем бит, к которому вы можете обратиться, является «зарезервировано». Вы спрашиваете о «зарезервированных» конкретно? Если нет, уточните свой вопрос. – AnT

ответ

18

C99 стандарт 6.7.2.1/10 (курсив мой):

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

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

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

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

+2

+10 если можно. Ваш ответ на этот вопрос - лучшая причина не использовать бит-поля для того, чтобы люди думали, что они полезны. –

+0

Я не понимал, что люди пытаются использовать их портативно, единственное, что я видел, - «поговорить с оборудованием из моей программы, которая использует компилятор X». И посмотрите на все циллионы «Я делаю это в компиляторе X, как это сделать в вопросах компилятора Y». –

+0

@CodeAbominator: в качестве примера я видел битовые поля, используемые для взлома сообщений сетевого протокола или бинарных форматов файлов. Я также видел, что некоторые из этого кода не работают при компиляции для другой платформы. –

2

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

+0

К сожалению, функциональное тестирование этой части кода составляет не менее нескольких недель, если не месяцев. (Существует много, что должно быть написано, чтобы действительно проверить все это, потому что я нахожусь в точке, где все, что осталось писать, более или менее взаимозависимо от всего остального.) Определенные константы - это вариант, но я бы предпочел использовать битовые поля, потому что для этого в моей кодовой строке потребуется логика * lot *. –

+1

Ну, быстрый эксперимент должен показать вам, что делает компилятор сейчас ... просто определите объединение, как указано выше, назначьте 0 на 'myVar4', затем назначьте 1« поле1 »и распечатайте результирующее значение из' myVar4'. Я бы повесил имя на неиспользуемом бите, который вы определили до 'field1', однако, чтобы компилятор не оптимизировал его. – jmaynard

4

Компилятор документы Visual Studio 2008 показывают:

Упорядочение данных, заявленных в качестве битовых полей от низкого до высокого бита

От "C++ Bit Fields", MSDN C++ Language Reference, Visual Studio 2008 version

+0

Как отмечали другие, в соответствующих стандартах это не указывается, и хорошо написано стандартизованный код, но это ответ на заданный вопрос, и читатель может решить, хотят ли они использовать свои полномочия навсегда или для удивительного. ;П – rakslice

Смежные вопросы