Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Kromě deklarátorů pro členy struktury nebo sjednocení může být deklarátor struktury také zadaný počet bitů, označovaný jako "bitové pole". Jeho délka je nastavena z deklarátoru pro název pole dvojtečka. Bitové pole se interpretuje jako celočíselný typ.
Syntaxe
struct-declarator
:
declarator
type-specifier
declarator
volit :
constant-expression
Určuje constant-expression
šířku pole v bitech. Hodnota type-specifier
musí declarator
být unsigned int
, signed int
nebo int
a constant-expression
musí být nenegativní celočíselná hodnota. Pokud je hodnota nula, deklarace nemá žádnou declarator
hodnotu . Pole bitových polí, ukazatele na bitová pole a funkce vracející bitová pole nejsou povolená. Volitelné declarator
názvy bitového pole. Bitová pole lze deklarovat pouze jako součást struktury. Operátor adresy (&
) nelze použít u součástí bitových polí.
Nepojmenovaná bitová pole se nedají odkazovat a jejich obsah za běhu je nepředvídatelný. Dají se použít jako "fiktivní" pole pro účely zarovnání. Nepojmenované bitové pole, jehož šířka je určena jako 0, zaručuje, že úložiště pro člena, který následuje za ním, začíná v seznamu deklarací struktury na int
hranici.
Početbitch Například tyto dva příkazy nejsou legální:
short a:17; /* Illegal! */
int long y:33; /* Illegal! */
Tento příklad definuje dvojrozměrné pole struktur pojmenovaných screen
.
struct
{
unsigned short icon : 8;
unsigned short color : 4;
unsigned short underline : 1;
unsigned short blink : 1;
} screen[25][80];
Pole obsahuje 2 000 prvků. Každý prvek je samostatná struktura obsahující čtyři bitové členy pole: icon
, color
, underline
, a blink
. Velikost každé struktury je 2 bajty.
Bitová pole mají stejnou sémantiku jako typ celého čísla. Bitové pole se používá ve výrazech stejným způsobem jako proměnná stejného základního typu. Nezáleží na tom, kolik bitů je v bitovém poli.
Specifické pro Microsoft
Bitová pole definovaná tak, jak int
jsou považována za signed
. Rozšíření Microsoftu standardu ANSI C umožňuje char
a long
typy bitových polí (a signed
unsigned
) pro bitová pole. Nepojmenovaná bitová pole se základním typem long
, short
nebo (signed
nebo char
unsigned
) vynucuje zarovnání na hranici odpovídající základnímu typu.
Bitová pole se přidělují v rámci celého čísla od nejmenšího k nejvýznamnějšímu bitu. V následujícím kódu
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 test
by byly uspořádány takto:
00000001 11110010
cccccccb bbbbaaaa
Vzhledem k tomu, že řada procesorů 8086 ukládá nízký bajt celočíselné hodnoty před vysokým bajtem, celé číslo 0x01F2
by bylo uloženo ve fyzické paměti, jak 0xF2
následuje 0x01
.
Standard ISO C99 umožňuje implementaci zvolit, zda bitové pole může chýlit dvě instance úložiště. Vezměte v úvahu tuto strukturu, která ukládá bitová pole, která celkem 64 bitů:
struct
{
unsigned int first : 9;
unsigned int second : 7;
unsigned int may_straddle : 30;
unsigned int last : 18;
} tricky_bits;
Standardní implementace jazyka C může tato bitová pole zabalit do dvou 32bitových celých čísel. Může obsahovat tricky_bits.may_straddle
16 bitů do jednoho 32bitového celého čísla a 14 bitů do dalšího 32bitového celého čísla. Konvence Windows ABI zabalí bitová pole do celých čísel úložiště a neschovává jednotky úložiště. Kompilátor Microsoftu ukládá každé bitové pole v příkladu výše, aby se zcela vešly do jednoho 32bitového celého čísla. V tomto případě first
jsou second
uloženy v jednom celočíselném may_straddle
čísle a jsou uloženy v druhém celočíselném čísle a last
jsou uloženy ve třetím celočíselném čísle. Operátor sizeof
vrátí 12
instanci tricky_bits
. Další informace naleznete v tématu Odsazení a zarovnání členů struktury.
END Microsoft Specific