Битовые поля в Си

Довольно уникальная для ЯП фишка Си – битовые поля структур

Опубликовано: 16.08.2018

Работая со структурами данных, нам иной раз нужно оперировать не целым полем, а лишь его частью. Например, если мы хотим работать с 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;
}

Выравнивание идёт по тем же правилам, что и при работе с обычными полями.

Также может быть вам интересно:
ПрограммыОбразованиеЯзык СиКод
← Enum - перечисляемый тип данных Union – Объединения в Си →