Bitfelder (bit fields) in C sind Mitglieder einer Struktur, die eine bestimmte Anzahl von Bits anstelle der Standardgröße des Typs einnehmen. Sie ermöglichen eine Einsparung von Speicher, insbesondere für die Speicherung von Flags und kompakten Statussets.
Deklaration:
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
In diesem Beispiel benötigt die Struktur mindestens 8 Bits statt 3 * sizeof(unsigned int).
Anwendungsgebiete:
Einschränkungen und Fallstricke:
Beispiel:
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
Frage: Kann man den Typ char oder signed int für Bitfelder verwenden?
Antwort: Der C-Standard erlaubt die Verwendung von int, unsigned int und (nach Compilererweiterungen) anderen Standard-Ganzzahltypen (char, short). Die Portabilität ist jedoch nur für int und unsigned int garantiert.
Beispiel für einen Fehler:
struct Example { signed char a : 3; }; // In verschiedenen Compilern/Architekturen gibt es unterschiedliche Regeln für die Speicherung des Vorzeichens und die Reihenfolge der Bits.
Geschichte
Bei der Integration von Software auf ARM und x86 stellte sich heraus, dass eine Struktur mit Bitfeldern unterschiedlich entpackt wurde: unterschiedliche Reihenfolgen der Bits und Ausrichtungen. Das Projekt wurde ohne Berücksichtigung dieser Unterschiede entworfen, was die Lesbarkeit der Daten in einer plattformübergreifenden Umgebung verhinderte.
Geschichte
In einem Motorsteuerungssystem wurden fälschlicherweise
char-Typen in Bitfeldstrukturen verwendet. Auf einigen ARM-Prozessoren führte dies zu einer fehlerhaften Vorzeichenweitergabe, was zu einer fehlerhaften Verarbeitung von Flags führte.
Geschichte
Im Netzwerkprotokoll wurden Bitfelder zur Packung von Nachrichtensignalen verwendet; man berücksichtigte nicht, dass nicht initialisierte hohe Felder Müllwerte enthalten, was bei der Übertragung zwischen Geräten zu zufälligen Zustandsfehlern führte.