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
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
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
@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