Udostępnij przez


Pola bitowe języka C

Oprócz deklaratorów dla składowych struktury lub unii deklarator struktury może być również określoną liczbą bitów nazywanych "polem bitowym". Jego długość jest ustawiana z deklaratora dla nazwy pola dwukropkiem. Pole bitowe jest interpretowane jako typ całkowity.

Składnia

struct-declarator:
declarator
type-specifierdeclaratorZdecydować:constant-expression

Parametr constant-expression określa szerokość pola w bitach. Element type-specifier musi declarator mieć unsigned intwartość , signed intlub int, a constant-expression musi być wartością nienegacyjną całkowitą. Jeśli wartość ma wartość zero, deklaracja nie declaratorma wartości . Tablice pól bitowych, wskaźniki do pól bitowych i funkcje zwracające pola bitowe nie są dozwolone. Opcjonalne declarator nazwy pola bitowego. Pola bitowe można zadeklarować tylko w ramach struktury. Nie można zastosować operatora adresu (&) do składników pól bitowych.

Nie można odwoływać się do nienazwanych pól bitowych, a ich zawartość w czasie wykonywania jest nieprzewidywalna. Mogą być one używane jako "fikcyjne" pola do celów wyrównania. Nienazwane pole bitowe, którego szerokość jest określona jako 0, gwarantuje, że magazyn elementu członkowskiego po nim na liście deklaracji struktury rozpoczyna się od int granicy.

Liczba bitów w polu bitowym musi być mniejsza lub równa rozmiarowi typu bazowego. Na przykład te dwie instrukcje nie są legalne:

short a:17;        /* Illegal! */
int long y:33;     /* Illegal! */

W tym przykładzie zdefiniowano dwuwymiarową tablicę struktur o nazwie screen.

struct
{
    unsigned short icon : 8;
    unsigned short color : 4;
    unsigned short underline : 1;
    unsigned short blink : 1;
} screen[25][80];

Tablica zawiera 2000 elementów. Każdy element to pojedyncza struktura zawierająca cztery elementy członkowskie pól bitowych: icon, , colorunderlinei blink. Rozmiar każdej struktury wynosi 2 bajty.

Pola bitowe mają te same semantyki co typ liczby całkowitej. Pole bitowe jest używane w wyrażeniach w taki sam sposób, jak zmienna tego samego typu podstawowego. Nie ma znaczenia, ile bitów znajduje się w polu bitowym.

Specyficzne dla firmy Microsoft

Pola bitowe zdefiniowane jako int są traktowane jako signed. Rozszerzenie firmy Microsoft do standardu ANSI C zezwala na char pola bitowe i long typy (zarówno signed , jak i unsigned). Pola bitów bez nazwy z typem longpodstawowym , lub charshort(signed lub unsigned) wymuszają wyrównanie do granicy odpowiedniej dla typu podstawowego.

Pola bitowe są przydzielane w obrębie liczby całkowitej z najmniej znaczących do najbardziej znaczących bitów. W poniższym kodzie

struct mybitfields
{
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
} test;

int main( void )
{
    test.a = 2;
    test.b = 31;
    test.c = 0;
    return 0;
}

bity elementu test będą ułożone w następujący sposób:

00000001 11110010
cccccccb bbbbaaaa

Ponieważ rodzina procesorów 8086 przechowuje niski bajt wartości całkowitych przed wysokim bajtem, liczba całkowita 0x01F2 będzie przechowywana w pamięci fizycznej, po 0xF2 czym 0x01następuje .

Standard ISO C99 pozwala implementacji wybrać, czy pole bitowe może straddle dwóch wystąpień magazynu. Należy wziąć pod uwagę tę strukturę, która przechowuje pola bitowe o łącznej wartości 64 bitów:

struct
{
    unsigned int first : 9;
    unsigned int second : 7;
    unsigned int may_straddle : 30;
    unsigned int last : 18;
} tricky_bits;

Standardowa implementacja języka C może spakować te pola bitowe do dwóch 32-bitowych liczb całkowitych. Może ona przechowywać tricky_bits.may_straddle jako 16 bitów w jednej 32-bitowej liczbą całkowitą i 14 bitami w następnej 32-bitowej liczbą całkowitą. Konwencje ABI systemu Windows pakują pola bitowe do pojedynczych liczb całkowitych magazynu i nie przecinają jednostek magazynu. Kompilator firmy Microsoft przechowuje każde pole bitowe w powyższym przykładzie, aby mieściło się całkowicie w jednej 32-bitowej liczbą całkowitą. W takim przypadku first i second są przechowywane w jednej liczbą całkowitą, may_straddle są przechowywane w drugiej liczbą całkowitą i last są przechowywane w trzeciej liczbą całkowitą. Operator sizeof zwraca wystąpienie 12 klasy tricky_bits. Aby uzyskać więcej informacji, zobacz Wypełnianie i wyrównanie elementów członkowskich struktury.

END Microsoft Specific

Zobacz też

Deklaracje struktury