C - Bitfelder
Angenommen, Ihr C-Programm enthält eine Reihe von TRUE/FALSE-Variablen, die wie folgt in einer Struktur namens Status gruppiert sind −
struct { unsigned int widthValidated; unsigned int heightValidated; } status;
Diese Struktur benötigt 8 Byte Speicherplatz, aber tatsächlich werden wir entweder 0 oder 1 in jeder der Variablen speichern. Die Programmiersprache C bietet in solchen Situationen eine bessere Möglichkeit, den Speicherplatz zu nutzen.
Wenn Sie solche Variablen innerhalb einer Struktur verwenden, können Sie die Breite einer Variablen definieren, die dem C-Compiler mitteilt, dass Sie nur diese Anzahl von Bytes verwenden werden. Beispielsweise kann die obige Struktur wie folgt umgeschrieben werden −
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status;
Die obige Struktur benötigt 4 Bytes Speicherplatz für Statusvariablen, aber nur 2 Bits werden verwendet, um die Werte zu speichern.
Wenn Sie bis zu 32 Variablen mit einer Breite von jeweils 1 Bit verwenden, wird auch die Statusstruktur 4 Bytes verwenden. Sobald Sie jedoch 33 Variablen haben, wird der nächste Slot des Speichers zugewiesen und es werden 8 Bytes verwendet. Sehen wir uns das folgende Beispiel an, um das Konzept zu verstehen −
Live-Demo#include <stdio.h> #include <string.h> /* define simple structure */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* define a structure with bit fields */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main( ) { printf( "Memory size occupied by status1 : %d\n", sizeof(status1)); printf( "Memory size occupied by status2 : %d\n", sizeof(status2)); return 0; }
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis −
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
Bitfelddeklaration
Die Deklaration eines Bitfeldes hat innerhalb einer Struktur folgende Form −
struct { type [member_name] : width ; };
Die folgende Tabelle beschreibt die variablen Elemente eines Bitfelds −
Sr.No. | Element &Beschreibung |
---|---|
1 | Typ Ein ganzzahliger Typ, der bestimmt, wie der Wert eines Bitfelds interpretiert wird. Der Typ kann int, signed int oder unsigned int sein. |
2 | Mitgliedsname Der Name des Bitfelds. |
3 | Breite Die Anzahl der Bits im Bitfeld. Die Breite muss kleiner oder gleich der Bitbreite des angegebenen Typs sein. |
Die mit einer vordefinierten Breite definierten Variablen werden als Bitfelder bezeichnet . Ein Bitfeld kann mehr als ein einzelnes Bit enthalten; Wenn Sie beispielsweise eine Variable zum Speichern eines Werts von 0 bis 7 benötigen, können Sie ein Bitfeld mit einer Breite von 3 Bit wie folgt definieren:−
struct { unsigned int age : 3; } Age;
Die obige Strukturdefinition weist den C-Compiler an, dass die Altersvariable nur 3 Bits verwenden wird, um den Wert zu speichern. Wenn Sie versuchen, mehr als 3 Bits zu verwenden, können Sie dies nicht tun. Versuchen wir folgendes Beispiel −
Live-Demo#include <stdio.h> #include <string.h> struct { unsigned int age : 3; } Age; int main( ) { Age.age = 4; printf( "Sizeof( Age ) : %d\n", sizeof(Age) ); printf( "Age.age : %d\n", Age.age ); Age.age = 7; printf( "Age.age : %d\n", Age.age ); Age.age = 8; printf( "Age.age : %d\n", Age.age ); return 0; }
Wenn der obige Code kompiliert wird, wird er mit einer Warnung kompiliert, und wenn er ausgeführt wird, erzeugt er das folgende Ergebnis −
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0
C Sprache