2009-10-22 6 views

Antwort

46

Die Bits 1 und 7 sind Bitgrößen, um den Bereich der Werte zu begrenzen. Sie sind typischerweise in Strukturen und Gewerkschaften zu finden. Zum Beispiel kann bei einigen Systemen (abhängig von der Breite und char Verpackungsregeln, 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.

Typischerweise in C verwendeten „compressed“ Werte wie beispielsweise ein 4-Bit-nybble zuzugreifen, die in der oberen Hälfte eines 8-Bit-Zeichen enthalten sein könnten: unter uns

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

für die Sprache Rechtsanwälte, der 9,6 Abschnitt des Standard 11 C++ dies im Detail erklärt, leicht umschrieben:


Bitfelder [class.bit]

Ein Mitglied-declarator des Formulars

          Identifikator opt       attribute-Spezifizierer opt      :       konstanter Ausdruck

spezifiziert ein Bitfeld; seine Länge ist vom Bitfeldnamen um einen Doppelpunkt getrennt. Der optionale Attributspezifizierer gehört zu der deklarierten Entität. Das Bitfeldattribut gehört nicht zum Typ des Klassenmembers.

Der konstante Ausdruck ist integraler konstanter Ausdruck mit einem Wert größer als oder gleich Null sein. Der Wert des Integralkonstantenausdrucks kann größer sein als die Anzahl der Bits in der Objektdarstellung des Bitfeldtyps; In solchen Fällen werden die zusätzlichen Bits als Füllbits verwendet und nehmen nicht an der Wertdarstellung des Bitfelds teil.

Die Zuordnung von Bitfeldern innerhalb eines Klassenobjekts ist implementierungsdefiniert. Die Ausrichtung von Bitfeldern ist implementierungsdefiniert. Bit-Felder werden in eine adressierbare Zuordnungseinheit gepackt.

Hinweis: Bit-Felder Straddle Zuordnungseinheiten auf einigen Computern und nicht auf anderen. Bit-Felder werden bei einigen Computern von rechts nach links zugewiesen, bei anderen von links nach rechts. - Endnote

+1

Streng genommen würden sie in reinem C nicht mit 'unsigned char' verwendet werden. C erlaubt nur "int", "signed int" und "unsigned int" in Bitfelddeklarationen. C99 fügt '_Bool' hinzu. 'unsigned char' ist kein gesetzlicher Typ für Bitfeld in C. – AnT

+0

Das ist ein Implementierungsproblem, zumindest in c1x: 6.7.2.1 para4 Ein Bitfeld sollte einen Typ haben, der eine qualifizierte oder nicht qualifizierte Version von \ _Bool ist, signed int , unsigned int oder * ein anderer implementierungsdefinierter Typ *. – paxdiablo

+1

@paxdiablo: Ja, aber das Bit "einige andere implementation-defined type" ist wirklich überflüssig, da die Implementierung die Sprache immer so erweitern darf, wie sie es für richtig hält, ohne eine ausdrückliche Erlaubnis im spezifischen Teil des Standards. Eine C-Implementierung kann Pascal- und Fortran-Code innerhalb von C-Code kompilieren - niemand verbietet dies. Es wäre jedoch seltsam, aus diesem Grund Fortran-Code als möglicherweise gültigen C-Code zu diskutieren. Das gilt auch für diesen "Implementierungs-definierten Typ". – AnT

7

Ich glaube, das wären Bitfields.

+0

Warum der Downvote? –

+7

Nicht sicher, es sei denn, es ist die Kürze oder Unsicherheit, aber hier ist ein upvote seit (1) Sie technisch korrekt sind; und (2) um die Liebe zu teilen :-) – paxdiablo

0

Genau genommen muss ein Bitfeld ein int, unsigned int oder _Bool sein. Obwohl die meisten Compiler einen ganzzahligen Typ annehmen werden.

Ref C11 6.7.2.1:

Ein Bit-Feld ist eine Art, die eine qualifizierte oder unqualifizierte Version von _Bool ist, unterzeichnet int, unsigned int oder eine andere Implementierung definierte Art.

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

Ref C11 6.7.2.1:

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

Die Einsparungen kommen, wenn Sie mehrere Bitfelder haben, die nacheinander deklariert werden. In diesem Fall wird der zugewiesene Speicher nach Möglichkeit gepackt.

Ref C11 6.7.2.1:

Wenn genügend Raum bleibt, ein Bitfeld, dass sofort ein anderes Bit-Feld in einer Struktur folgt ist in benachbarte Bits der gleichen Einheit verpackt werden. Wenn nicht genügend Platz vorhanden ist, , ob ein Bitfeld, das nicht passt, in die nächste Einheit eingegeben wird oder benachbarte Einheiten überlappt, ist implementierungsdefiniert.