Campi di bit CC Bit Fields

In aggiunta alle dichiarazioni dei membri di una struttura o di un'unione, un dichiaratore di struttura può anche essere un numero specificato di bit, definito campo di bit.In addition to declarators for members of a structure or union, a structure declarator can also be a specified number of bits, called a "bit field." Per il nome del campo, la lunghezza viene impostata all'esterno del dichiaratore tramite due punti.Its length is set off from the declarator for the field name by a colon. Un campo di bit viene interpretato come un tipo integrale.A bit field is interpreted as an integral type.

SintassiSyntax

struct-declarator:struct-declarator:
declaratordeclarator

type-specifier declarator opt: constant-expressiontype-specifier declarator opt: constant-expression

L'elemento constant-expression specifica la lunghezza del campo in bit.The constant-expression specifies the width of the field in bits. L'elemento type-specifier per declarator deve essere unsigned int, signed int o int e l'elemento constant-expression deve essere un valore intero non negativo.The type-specifier for the declarator must be unsigned int, signed int, or int, and the constant-expression must be a nonnegative integer value. Se il valore è zero, la dichiarazione non ha un elemento declarator.If the value is zero, the declaration has no declarator. Matrici di campi di bit, puntatori a campi di bit e funzioni che restituiscono campi di bit non sono consentiti.Arrays of bit fields, pointers to bit fields, and functions returning bit fields are not allowed. L'elemento declarator facoltativo assegna il nome al campo di bit.The optional declarator names the bit field. I campi di bit possono essere dichiarati come parte di una struttura.Bit fields can only be declared as part of a structure. L'operatore address-of (&) non può essere applicato ai componenti di un campo di bit.The address-of operator (&) cannot be applied to bit-field components.

A campi di bit senza nome non si può fare riferimento e il relativo contenuto non è prevedibile in fase di esecuzione.Unnamed bit fields cannot be referenced, and their contents at run time are unpredictable. I campi di bit possono essere utilizzati come campi fittizi per scopi di allineamento.They can be used as "dummy" fields, for alignment purposes. Un campo di bit senza nome la cui lunghezza specificata è 0 garantisce che l'archiviazione per il membro successivo in struct-declaration-list inizi su un limite int.An unnamed bit field whose width is specified as 0 guarantees that storage for the member following it in the struct-declaration-list begins on an int boundary.

La lunghezza dei campi di bit deve anche essere sufficiente per contenere lo schema di bit.Bit fields must also be long enough to contain the bit pattern. Le due istruzioni seguenti, ad esempio, non sono corrette:For example, these two statements are not legal:

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

Questo esempio definisce una matrice bidimensionale di strutture denominata screen.This example defines a two-dimensional array of structures named screen.

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

La matrice contiene 2.000 elementi.The array contains 2,000 elements. Ogni elemento è un struttura individuale contenente quattro membri di tipo campo di bit: icon, color, underline e blink.Each element is an individual structure containing four bit-field members: icon, color, underline, and blink. La dimensione di ogni struttura è di due byte.The size of each structure is two bytes.

I campi di bit hanno la stessa semantica dei tipi interi.Bit fields have the same semantics as the integer type. Questo significa che un campo di bit è utilizzato nelle espressioni in modo analogo a come verrebbe utilizzata una variabile dello stesso tipo di base, indipendentemente al numero di bit presenti nel campo.This means a bit field is used in expressions in exactly the same way as a variable of the same base type would be used, regardless of how many bits are in the bit field.

Sezione specifica MicrosoftMicrosoft Specific

Campi di bit definiti come int vengono trattati come interi con segno.Bit fields defined as int are treated as signed. Un'estensione Microsoft allo standard ANSI C consente i tipi char e long (sia signed che unsigned) per i campi di bit.A Microsoft extension to the ANSI C standard allows char and long types (both signed and unsigned) for bit fields. I campi di bit senza nome con tipo di base long, short o char (signed o unsigned) forzano l'allineamento su un limite appropriato al tipo di base.Unnamed bit fields with base type long, short, or char (signed or unsigned) force alignment to a boundary appropriate to the base type.

I campi di bit sono allocati in un Integer dal bit meno significativo a quello più significativo.Bit fields are allocated within an integer from least-significant to most-significant bit. Nel codice riportato di seguitoIn the following code

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;  
}  

i bit sono disposti come segue:the bits would be arranged as follows:

00000001 11110010  
cccccccb bbbbaaaa  

Dato che la famiglia di processori 8086 memorizza il byte basso dei valori interi prima di quello alto, il valore intero 0x01F2 precedente verrebbe memorizzato nella memoria fisica come 0xF2 seguito da 0x01.Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.

Fine sezione specifica MicrosoftEND Microsoft Specific

Vedere ancheSee Also

Dichiarazioni di strutturaStructure Declarations