Sdílet prostřednictvím


Bitová pole jazyka C

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-specifierdeclaratorvolit : constant-expression

Určuje constant-expression šířku pole v bitech. Hodnota type-specifier musí declarator být unsigned int, signed intnebo inta constant-expression musí být nenegativní celočíselná hodnota. Pokud je hodnota nula, deklarace nemá žádnou declaratorhodnotu . 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, shortnebo (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

Viz také

Deklarace struktury