C - Campos de bits
Suponha que seu programa C contenha um número de variáveis TRUE/FALSE agrupadas em uma estrutura chamada status, como segue −
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status;
Essa estrutura requer 8 bytes de espaço de memória, mas na verdade vamos armazenar 0 ou 1 em cada uma das variáveis. A linguagem de programação C oferece uma maneira melhor de utilizar o espaço de memória em tais situações.
Se você estiver usando essas variáveis dentro de uma estrutura, poderá definir a largura de uma variável que informa ao compilador C que você usará apenas esse número de bytes. Por exemplo, a estrutura acima pode ser reescrita da seguinte forma -
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
A estrutura acima requer 4 bytes de espaço de memória para a variável de status, mas apenas 2 bits serão usados para armazenar os valores.
Se você usar até 32 variáveis, cada uma com largura de 1 bit, a estrutura de status também usará 4 bytes. No entanto, assim que você tiver 33 variáveis, ele alocará o próximo slot da memória e começará a usar 8 bytes. Vamos verificar o seguinte exemplo para entender o conceito -
Demonstração ao vivo
#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 o código acima é compilado e executado, ele produz o seguinte resultado -
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
Declaração de campo de bits
A declaração de um campo de bits tem a seguinte forma dentro de uma estrutura -
struct {
type [member_name] : width ;
};
A tabela a seguir descreve os elementos variáveis de um campo de bits -
| Nº Sr. | Elemento e descrição |
|---|---|
| 1 | tipo Um tipo inteiro que determina como o valor de um campo de bits é interpretado. O tipo pode ser int, assinado int ou unsigned int. |
| 2 | nome_membro O nome do campo de bits. |
| 3 | largura O número de bits no campo de bits. A largura deve ser menor ou igual à largura de bits do tipo especificado. |
As variáveis definidas com uma largura predefinida são chamadas de campos de bits . Um campo de bits pode conter mais de um único bit; por exemplo, se você precisar de uma variável para armazenar um valor de 0 a 7, poderá definir um campo de bits com uma largura de 3 bits da seguinte maneira −
struct {
unsigned int age : 3;
} Age;
A definição de estrutura acima instrui o compilador C que a variável age usará apenas 3 bits para armazenar o valor. Se você tentar usar mais de 3 bits, isso não permitirá que você faça isso. Vamos tentar o seguinte exemplo -
Demonstração ao vivo
#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 o código acima é compilado, ele compilará com um aviso e, quando executado, produzirá o seguinte resultado -
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0
Linguagem C