Definição de campo de bits
A definição do campo de bits é semelhante à estrutura da estrutura
struct 位域结构名
{
// 位域列表
type [name] : width ;
};
Descrição de cada elemento na lista de campos de bits:
tpye: O tipo só pode ser int (tipo inteiro), unsigned int (tipo inteiro não assinado), assinado int (tipo inteiro assinado)
[nome]: O nome do campo de bit, seguindo as regras de nomenclatura da variável, [] colchetes são opcionais. Se não houver nome, representa um campo vazio. Este campo de bit não está disponível, semelhante ao espaço reservado largura: O campo de bit ocupa quantos bits deste tipo. O tamanho da
largura deve ser menor que Igual ao tamanho da memória ocupada pelo tipo, como int 32 bits, largura deve ser menor ou igual a 32
struct flag
{
int debug : 1; // 使用一位来存储是否是debug模式
};
Uso de campos de bits
Nome da variável do campo de bits.Nome do campo de bits
Nome da variável do campo de bits->Nome do campo de bits
flag fg; // 普通变量
fg.debug = 1;
flag* pfg; // 指针
pfg->debug = 1;
O tamanho da memória ocupada pelo campo de bits
O tamanho da memória ocupada pelo campo de bits = a soma das larguras de todos os campos de bits / o quociente de sizeof(type) é arredondado e multiplicado por sizeof(type) size = ceil(width / sizeof(type))
* sizeof(tipo)
struct flag
{
int debug : 1;
int show_cursor : 1;
};
struct flag_1
{
int debug : 1;
int show_cursor : 32;
};
int main()
{
printf("flag size %d\n", sizeof(flag));
printf("flag_1 size %d\n", sizeof(flag_1));
}
saída
flag size 4
flag_1 size 8
Combinação de bitfield e união
O poder da combinação de campo de bits e união pode redefinir todos os bits para 0 ao mesmo tempo, o que é muito conveniente para limpar o campo de bits.
union flag
{
struct
{
int debug : 1;
int show_cursor : 1;
};
int all;
};
// 转化为二进制输出
void print(int flag)
{
char s[33] = {
'0'};
itoa(flag, s, 2);
printf("flag %s\n", s);
}
int main()
{
flag f;
//清空所有位
f.all = 0;
print(f.all);
f.debug = 0;
f.show_cursor = 1;
print(f.all);
f.all = 0;
f.debug = 1;
f.show_cursor = 1;
print(f.all);
return 0;
}
saída
flag 0
flag 10
flag 11
O que acontece se o valor atribuído exceder o tamanho do campo de bits?
Se o valor atribuído for maior que o valor máximo que o campo de bit pode representar, o valor do campo de bit será truncado em vez de convertido para 0 ou 1.
Por exemplo, um campo de bit com largura 1 só pode marcar 0 ou 1, então se eu atribuir um valor 3, ele será truncado. O
valor binário de 3 é 11. No final, será truncado apenas para um bit. O bit truncado será atribuído ao campo de bits. Portanto, o valor atribuído não deve ser maior que a largura, caso contrário ocorrerão bugs inesperados.