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-specifier
declarator
Zdecydować:
constant-expression
Parametr constant-expression
określa szerokość pola w bitach. Element type-specifier
musi declarator
mieć unsigned int
wartość , signed int
lub int
, a constant-expression
musi być wartością nienegacyjną całkowitą. Jeśli wartość ma wartość zero, deklaracja nie declarator
ma 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
, , color
underline
i 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 long
podstawowym , lub char
short
(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 0x01
nastę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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla