Битовые поля (bit fields) в C — это члены структуры, занимающие заданное количество бит вместо стандартного размера типа. Они позволяют экономить память, особенно для хранения флагов и компактичных наборов состояний.
Объявление:
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
В этом примере структура занимает минимум 8 бит, а не 3 * sizeof(unsigned int).
Где применять:
Ограничения и подводные камни:
Пример:
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
Вопрос: Можно ли использовать тип char или signed int для битовых полей?
Ответ: Стандарт C разрешает использовать int, unsigned int и (по расширениям компиляторов) другие стандартные целочисленные типы (char, short). Однако переносимость гарантируется только для int и unsigned int.
Пример ошибки:
struct Example { signed char a : 3; }; // На разных компиляторах/архитектурах разные правила хранения знака и порядка бит.
История
При интеграции ПО на ARM и x86 выяснилось, что структура с битовыми полями распаковывалась по-разному: различные порядок бит и выравнивание. Проектировал без учёта этих различий, что привело к невозможности читать данные в кроссплатформенной среде.
История
В системе управления двигательными контроллерами в bit field структуры ошибочно был использован тип
char. На некоторых ARM-процессорах это сопровождалось некорректным расширением знака, что приводило к ошибочной обработке флагов.
История
В сетевом протоколе использовали битовые поля для упаковки флагов сообщения; не учли, что старшие неинициализированные поля остаются мусорными. При передаче между устройствами возникали случайные ошибки состояния из-за различий в инициализации.