Pola bitowe (bit fields) w C to człony struktury, które zajmują określoną liczbę bitów zamiast standardowego rozmiaru typu. Pozwalają one zaoszczędzić pamięć, szczególnie do przechowywania flag i zwartych zestawów stanów.
Deklaracja:
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
W tym przykładzie struktura zajmuje minimum 8 bitów, a nie 3 * sizeof(unsigned int).
Gdzie stosować:
Ograniczenia i pułapki:
Przykład:
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
Pytanie: Czy można używać typu char lub signed int dla pól bitowych?
Odpowiedź: Standard C zezwala na używanie int, unsigned int oraz (zgodnie z rozszerzeniami kompilatorów) innych standardowych typów całkowitych (char, short). Jednak przenośność jest gwarantowana tylko dla int i unsigned int.
Przykład błędu:
struct Example { signed char a : 3; }; // Na różnych kompilatorach/architekturach różne zasady przechowywania znaku i kolejności bitów.
Historia
Podczas integracji oprogramowania na ARM i x86 okazało się, że struktura z polami bitowymi była rozpakowywana różnie: różne kolejności bitów i wyrównania. Projektowano bez uwzględnienia tych różnic, co doprowadziło do niemożności odczytywania danych w środowisku wieloplatformowym.
Historia
W systemie zarządzania kontrolerami silników w struktury bit field błędnie użyto typu
char. Na niektórych procesorach ARM prowadziło to do nieprawidłowego rozszerzenia znaku, co skutkowało błędnym przetwarzaniem flag.
Historia
W protokole sieciowym użyto pól bitowych do pakowania flag wiadomości; nie uwzględniono, że starsze nieinicjalizowane pola pozostają zanieczyszczone. Podczas transmisji między urządzeniami występowały losowe błędy stanu z powodu różnic w inicjalizacji.