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