Introdução aos campos neutros em c++

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.

Acho que você gosta

Origin blog.csdn.net/qq_33944628/article/details/132806428
Recomendado
Clasificación