C - Bitvelden
Stel dat uw C-programma een aantal TRUE/FALSE-variabelen bevat, gegroepeerd in een structuur die status wordt genoemd, als volgt:−
struct { unsigned int widthValidated; unsigned int heightValidated; } status;
Deze structuur vereist 8 bytes geheugenruimte, maar in feite gaan we 0 of 1 opslaan in elk van de variabelen. De programmeertaal C biedt een betere manier om de geheugenruimte in dergelijke situaties te benutten.
Als u dergelijke variabelen binnen een structuur gebruikt, kunt u de breedte van een variabele definiëren die de C-compiler vertelt dat u alleen dat aantal bytes gaat gebruiken. De bovenstaande structuur kan bijvoorbeeld als volgt worden herschreven −
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status;
De bovenstaande structuur vereist 4 bytes geheugenruimte voor de statusvariabele, maar er worden slechts 2 bits gebruikt om de waarden op te slaan.
Als u maximaal 32 variabelen wilt gebruiken, elk met een breedte van 1 bit, dan zal ook de statusstructuur 4 bytes gebruiken. Zodra u echter 33 variabelen hebt, wijst het de volgende sleuf van het geheugen toe en begint het 8 bytes te gebruiken. Laten we het volgende voorbeeld bekijken om het concept te begrijpen −
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; }
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
Bitvelddeclaratie
De declaratie van een bitveld heeft de volgende vorm binnen een structuur −
struct { type [member_name] : width ; };
De volgende tabel beschrijft de variabele elementen van een bitveld −
Zr.nr. | Element en beschrijving |
---|---|
1 | type Een integer type dat bepaalt hoe de waarde van een bitveld wordt geïnterpreteerd. Het type kan int, ondertekend int of unsigned int zijn. |
2 | naam lid De naam van het bitveld. |
3 | breedte Het aantal bits in het bitveld. De breedte moet kleiner zijn dan of gelijk zijn aan de bitbreedte van het opgegeven type. |
De variabelen die met een vooraf gedefinieerde breedte zijn gedefinieerd, worden bitvelden genoemd . Een bitveld kan meer dan een enkele bit bevatten; als u bijvoorbeeld een variabele nodig hebt om een waarde van 0 tot 7 op te slaan, kunt u als volgt een bitveld met een breedte van 3 bits definiëren −
struct { unsigned int age : 3; } Age;
De bovenstaande structuurdefinitie instrueert de C-compiler dat de variabele leeftijd slechts 3 bits gaat gebruiken om de waarde op te slaan. Als u meer dan 3 bits probeert te gebruiken, kunt u dit niet doen. Laten we het volgende voorbeeld proberen −
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; }
Wanneer de bovenstaande code is gecompileerd, wordt deze gecompileerd met een waarschuwing en wanneer deze wordt uitgevoerd, levert deze het volgende resultaat op −
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0
C Taal
- C# Bitsgewijze en Bit Shift-operators
- Soorten door de gebruiker gedefinieerde functies in C-programmering
- Geef arrays door aan een functie in C
- C-structuren en aanwijzers
- Java dit trefwoord
- Java-inkapseling
- C++-structuur met voorbeeld
- C - Functies
- C - Variabele argumenten
- MATLAB - Integratie
- C# - Methoden