C Handbuch bestellen

Das C Tutorial (deutsch)

Strukturierte Datentypen

Bitfelder

Mit einem Bitfeld können wir Variablen erstellen, deren Größe wir selbst bestimmen.  Dies hat den Vorteil, dass kein überflüssiger Speicherplatz belegt wird. Deshalb eignet sich dies auch hervorragend zur Programmierung von Hardware. Die Variablen eines Bitfeldes müssen vom Typ int sein, also int, short, long und char.

Ein Rechenbeispiel: Möchte man zum Beispiel eine Zahl speichern, deren Wert niemals größer als 12 wird, benötigt man dafür 4 Bits (2^4 ist 16, 12 < 16). Würde man diese Zahl in einer char Variable speichern, belegt dies schon 1 Byte (1 Byte sind 8 Bit, 2^8 ist 256), somit sind 4 Bit verschwendet. Bei short mit 16 Bit wären 12 Bit ungenutzt.

Ein Bitfeld sieht einer Struktur ähnlich, es wird ebenfalls mit dem Schlüsselwort struct eingeleitet. Bei der Deklaration der Variablen wird nach dem Namen ein Doppelpunkt geschrieben, danach folgt die Größe, also die Anzahl der Bits.

Beispiel

In diesem Beispiel soll eine Uhrzeit gespeichert werden. Für die Angabe einer Stunde benötigen wir einen Zahlenraum von 0-23, also 24 Zustände. Dafür reichen 5 Bits aus, da 2^5 = 32 und 24 < 32. Für die Angabe der Minuten benötigen wir 60 Zustände (0-59). Dafür reichen 6 Bits aus, da 2^6 = 64 und 60 < 64.

struct time {
	unsigned int hour:	5;
	unsigned int minute:	6;
} myTime;


myTime.hour = 13;
myTime.minute = 37;

printf("Ist es jetzt %02d:%02d Uhr?\n", myTime.hour, myTime.minute );
Ist es jetzt 13:37 Uhr?

Bitfeld im Speicher

Zu unserem obigen Beispiel sehen wir hier das zugehörige Speicherbild. Die Elemente werden aneinanderhängend abgelegt. Die Reihenfolge ist jedoch Compiler-Sache.

Bitfeld im Speicher

Wissenswertes zu Bitfeldern

  • Von den Elementen eines Bitfeldes können keine Felder und Zeiger erstellt werden. Vom Bitfeld selbst dagegen schon.
  • Wie die Bits eines Bitfeldelementes im Speicher abgelegt werden, ist nicht standardisiert. Dies kann von Compiler zu Compiler unterschiedlich sein.
  • Der Zugriff auf Bitfeldelemente ist langsamer als der auf herkömmliche Datentypen. Die Elemente haben keine einheitliche Größe und können somit über mehrere Speicheradressen hinweg verteilt liegen, beziehungsweise mehrere Elementteile können sich eine Speicheradresse teilen.