Довольно уникальная для ЯП фишка Си – битовые поля структур
Работая со структурами данных, нам иной раз нужно оперировать не целым полем, а лишь его частью. Например, если мы хотим работать с IP-пакетами, то нужно учесть и те поля IP-заголовка, которые занимают половину байта, или даже бит.
И тут на помощь нам приходят битовые поля структур. Как понятно из названия, нужны они для доступа к отдельным битам (или наборам бит). Реализованы они в Си на базе структур:
struct <имя> {
<тип> <имя>: <размер>;
...
}
Пример использования:
#include <stdio.h> struct SomeData { unsigned a: 1; unsigned b: 2; unsigned c: 4; unsigned d: 1; unsigned e: 32; // Добавить/убрать для просмотра разницы }; int main() { struct SomeData data = { 0, 3, 12, 1, 1234 }; printf("%lu\n", sizeof(data)); printf("%d\n", data.a); printf("%d\n", data.b); printf("%d\n", data.c); printf("%d\n", data.d); printf("%d\n", data.e); return 0; }
Выравнивание идёт по тем же правилам, что и при работе с обычными полями.