C - Campi di bit
Supponiamo che il tuo programma C contenga un numero di variabili VERO / FALSO raggruppate in una struttura chiamata stato, come segue:
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status;
Questa struttura richiede 8 byte di spazio di memoria ma in realtà memorizzeremo 0 o 1 in ciascuna delle variabili. Il linguaggio di programmazione C offre un modo migliore per utilizzare lo spazio di memoria in tali situazioni.
Se stai usando tali variabili all'interno di una struttura, puoi definire la larghezza di una variabile che dice al compilatore C che utilizzerai solo quel numero di byte. Ad esempio, la struttura sopra può essere riscritta come segue:
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
La struttura sopra richiede 4 byte di spazio di memoria per la variabile di stato, ma solo 2 bit verranno utilizzati per memorizzare i valori.
Se utilizzerai fino a 32 variabili ciascuna con una larghezza di 1 bit, anche la struttura di stato utilizzerà 4 byte. Tuttavia, non appena hai 33 variabili, allocherà lo slot successivo della memoria e inizierà a utilizzare 8 byte. Controlliamo il seguente esempio per comprendere il concetto:
#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;
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Memory size occupied by status1 : 8
Memory size occupied by status2 : 4
Dichiarazione del campo di bit
La dichiarazione di un campo di bit ha la seguente forma all'interno di una struttura:
struct {
type [member_name] : width ;
};
La tabella seguente descrive gli elementi variabili di un campo di bit:
Sr.No. | Elemento e descrizione |
---|---|
1 | type Un tipo intero che determina come viene interpretato il valore di un campo di bit. Il tipo può essere int, signed int o unsigned int. |
2 | member_name Il nome del campo di bit. |
3 | width Il numero di bit nel campo bit. La larghezza deve essere minore o uguale alla larghezza di bit del tipo specificato. |
Vengono chiamate le variabili definite con una larghezza predefinita bit fields. Un campo di bit può contenere più di un singolo bit; ad esempio, se hai bisogno di una variabile per memorizzare un valore da 0 a 7, puoi definire un campo di bit con una larghezza di 3 bit come segue:
struct {
unsigned int age : 3;
} Age;
La precedente definizione della struttura indica al compilatore C che la variabile age utilizzerà solo 3 bit per memorizzare il valore. Se provi a utilizzare più di 3 bit, non ti consentirà di farlo. Proviamo il seguente esempio:
#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;
}
Quando il codice sopra viene compilato, verrà compilato con un avviso e quando viene eseguito, produce il seguente risultato:
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0