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

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

ПрограммыОбразованиеЯзык СиКод

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

Enum - перечисляемый тип данных

Распространённый тип данных во многих языках программирования. Как же он выглядит в Си?

Фото Union – Объединения в Си

Union – Объединения в Си

Опять же довольно уникальная фишка Си – возможность смотреть на одни и те же байты по-разному