Was ist ein Doppelpunkt in einer Strukturdeklaration bedeuten, wie zum Beispiel: 1,: 7,: 16 oder: 32?

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

  •  05-07-2019
  •  | 
  •  

Frage

Was bedeutet der folgende C ++ Code bedeuten?

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

Ich denke, es schafft zwei char a und b, und beide sollten ein Byte lang sein, aber ich habe keine Ahnung, was die „1“ und „: 7“ Teil der Fall ist.

War es hilfreich?

Lösung

Die 1 und die 7-Bit-Größen den Bereich der Werte zu begrenzen. Sie sind typischerweise in Strukturen und Gewerkschaften gefunden. Zum Beispiel auf einigen Systemen (abhängig von char Breite und Verpackungsvorschriften usw.), der Code:

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

erzeugt einen 8-Bit-Wert, ein Bit für a und 7 Bits für b.

in der Regel C zu verwende „compressed“ Werte zuzugreifen, wie beispielsweise ein 4-Bit-Nibble, die in der oberen Hälfte eines 8-Bit-Zeichen enthalten sein könnten:

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

Für die Sprache Anwälte unter uns, die 9,6 Abschnitt des C ++ 11-Standard erklärt dies im Detail, leicht paraphrasiert:


Bit-Felder [class.bit]

Ein Mitglied Deklarator der Form

Kennung opt Attribut-Bezeichner opt : konstanter Ausdruck

legt ein Bit-Feld; seine Länge wird durch einen Doppelpunkt von den Bit-Feldnamen auf dem Weg. Das optionale Attribut-Bezeichner appertains an das Unternehmen erklärt werden. Das Bit-Feld-Attribut ist nicht Teil des Typs der Klasse Mitglieds.

Die konstanter Ausdruck ist integraler konstanter Ausdruck mit einem Wert größer als oder gleich Null sein. Der Wert des Integral konstanten Ausdrucks sein kann, größer als die Anzahl der Bits in der Objektdarstellung des Bits-Feldes des Typs; In solchen Fällen werden die zusätzlichen Bits als Füllbits und nicht beteiligen sich an der Wertdarstellung des Bit-Feld.

verwendet

Zuordnung der Bit-Felder in einem Klassenobjekt ist die Implementierung definiert. Die Ausrichtung von Bitfeldern ist die Implementierung definiert. Bit-Felder werden in eine adressierbare Zuordnungseinheit verpackt.

Hinweis: Bit-Felder spreizen Zuordnungseinheiten auf einigen Maschinen und nicht auf andere. Bit-Felder werden von rechts nach links auf einigen Maschinen, von links nach rechts auf anderen zugewiesen. - Endnote

Andere Tipps

Ich glaube, diejenigen bitfields wäre.

Genau genommen ein Bitfeld muss ein int, unsigned int oder _Bool sein. Obwohl die meisten Compiler jede integrale Art nehmen.

Ref C11 6.7.2.1:

  

Ein Bit-Feld ist eine Art, die eine qualifizierte oder unqualifizierte ist   Version von _Bool, signed int, unsigned int oder einem anderen   Implementierung definiert Art.

Ihr Compiler wird wahrscheinlich 1 Byte Speicherplatz zuweisen, aber es ist frei, um mehr zu greifen.

Ref C11 6.7.2.1:

  

Eine Implementierung zuweisen kann jede adressierbare Speichereinheit groß   genug, um ein bit- Feld zu halten.

Die Einsparungen kommt, wenn Sie mehrere Bitfelder haben, die einer nach dem anderen erklärt werden. In diesem Fall stellte die Lagerung, wenn möglich verpackt werden.

Ref C11 6.7.2.1:

  

Wenn genügend Platz vorhanden ist, ein Bit-Feld, das   unmittelbar folgt in einer Struktur ein anderes Bit-Feld verpackt werden soll   in benachbarte Bits der gleichen Einheit. Wenn nicht genügend Platz bleibt,   ob ein Bit-Feld, das nicht gesetzt in die nächste Einheit paßt oder   angrenzenden Einheiten überlappt, ist die Implementierung definiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top