Cosa significano i due punti in una dichiarazione di struct, come ad esempio: 1,: 7,: 16 o: 32?

StackOverflow https://stackoverflow.com/questions/1604968

  •  05-07-2019
  •  | 
  •  

Domanda

Cosa significa il seguente codice C ++?

unsigned char a : 1; 
unsigned char b : 7;

Suppongo che crei due caratteri aeb, ed entrambi dovrebbero essere lunghi un byte, ma non ho idea di cosa sia il " ;: 1 " e " ;: 7 " parte fa.

È stato utile?

Soluzione

1 e 7 sono dimensioni di bit per limitare l'intervallo dei valori. Si trovano in genere in strutture e sindacati. Ad esempio, su alcuni sistemi (dipende dalla larghezza char e dalle regole di imballaggio, ecc.), Il codice:

typedef struct {
    unsigned char a : 1;
    unsigned char b : 7;
} tOneAndSevenBits;

crea un valore di 8 bit, un bit per a e 7 bit per b .

Tipicamente usato in C per accedere a "compresso" valori come un nybble a 4 bit che potrebbe essere contenuto nella metà superiore di un carattere a 8 bit:

typedef struct {
    unsigned char leftFour  : 4;
    unsigned char rightFour : 4;
} tTwoNybbles;

Per gli avvocati di lingua tra di noi, la sezione 9.6 dello standard C ++ 11 spiega questo in dettaglio, leggermente parafrasato:


Campi bit [class.bit]

Un membro-dichiaratore del modulo

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; identificatore opt & nbsp; & nbsp; & nbsp; attributo-specifier opt & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; espressione-costante

specifica un campo bit; la sua lunghezza è separata dal nome del campo bit da due punti. L'opzione specificatore di attributi facoltativo si riferisce all'entità dichiarata. L'attributo bit-field non fa parte del tipo di membro della classe.

La espressione costante deve essere un'espressione costante integrale con un valore maggiore o uguale a zero. Il valore dell'espressione della costante integrale può essere maggiore del numero di bit nella rappresentazione dell'oggetto del tipo di campo di bit; in questi casi i bit extra vengono utilizzati come bit di riempimento e non partecipano alla rappresentazione del valore del campo di bit.

L'allocazione di campi bit all'interno di un oggetto classe è definita dall'implementazione. L'allineamento dei campi di bit è definito dall'implementazione. I campi di bit sono raggruppati in alcune unità di allocazione indirizzabili.

Nota: i campi di bit si trovano a cavallo delle unità di allocazione su alcune macchine e non su altre. I campi di bit sono assegnati da destra a sinistra su alcune macchine, da sinistra a destra su altre. - nota finale

Altri suggerimenti

Credo che sarebbero bitfield.

A rigor di termini, un bitfield deve essere int, unsigned int o _Bool. Sebbene la maggior parte dei compilatori prenderà qualsiasi tipo integrale.

Rif. C11 6.7.2.1:

  

Un campo bit deve avere un tipo qualificato o non qualificato   versione di _Bool, int int, unsigned int o qualche altra   tipo definito dall'implementazione.

Il compilatore probabilmente assegnerà 1 byte di memoria, ma è libero di prenderne di più.

Rif. C11 6.7.2.1:

  

Un'implementazione può allocare qualsiasi unità di archiviazione indirizzabile di grandi dimensioni   abbastanza per contenere un bit-field.

Il risparmio arriva quando si hanno più campi di bit che vengono dichiarati uno dopo l'altro. In questo caso, lo spazio allocato verrà impacchettato, se possibile.

Rif. C11 6.7.2.1:

  

Se rimane abbastanza spazio, un campo bit quello   segue immediatamente un altro campo bit in una struttura deve essere impacchettato   in bit adiacenti della stessa unità. Se rimane spazio insufficiente,   se un campo bit che non si adatta viene inserito nell'unità successiva o   si sovrappone alle unità adiacenti è definita dall'implementazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top