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