O que faz um cólon numa declaração significativo estrutura, tais como: 1,: 7,: 16, ou: 32?

StackOverflow https://stackoverflow.com/questions/1604968

  •  05-07-2019
  •  | 
  •  

Pergunta

O que faz o seguinte C ++ média código?

unsigned char a : 1; 
unsigned char b : 7;

Eu acho que ele cria dois char a e b, e ambos devem ser um byte de comprimento, mas não tenho idéia do que a ": 1" e ": 7" parte faz.

Foi útil?

Solução

A 1 e a 7 são tamanhos de bits para limitar a gama de valores. Eles são normalmente encontrados em estruturas e sindicatos. Por exemplo, em alguns sistemas (depende da largura char e regras de embalagem, etc), o código:

typedef struct {
    unsigned char a : 1;
    unsigned char b : 7;
} tOneAndSevenBits;

cria um valor de 8 bits, um bit para a e 7 bits para b.

Normalmente usado em C para acesso "comprimido" valores, tais como uma nybble 4 bits que pode ser contido no topo da metade de um carvão animal de 8 bits:

typedef struct {
    unsigned char leftFour  : 4;
    unsigned char rightFour : 4;
} tTwoNybbles;

Para os advogados de língua entre nós, a seção do C 11 ++ padrão 9,6 explica isso em detalhes, um pouco parafraseado:


Os campos de bit [class.bit]

Um membro-declarator da forma

identificador opt atributo especificador opt : constante expressão

especifica um bit-campo; o seu comprimento é ajustado fora a partir do nome de campo de bit de dois pontos. O opcional atributo especificador pertence à entidade que está sendo declarado. O atributo bit-campo não faz parte do tipo do membro da classe.

O constante expressão deve ser uma expressão constante integral com um valor maior ou igual a zero. O valor da expressão constante integral pode ser maior do que o número de bits na representação objecto do tipo do o campo de bits; em tais casos, os bits extras são usados ??como bits de preenchimento e não participam na representação valor do bit-campo.

A atribuição de bit-campos dentro de um objeto de classe é definido pela implementação. Alinhamento de campos de bit é definido pela implementação. Os campos de bit são embalados em alguma unidade de alocação endereçável.

Nota: bit-campos unidades de alocação de straddle em algumas máquinas e não sobre os outros. Os campos de bit são atribuídos da direita para a esquerda em algumas máquinas, da esquerda para a direita sobre os outros. - nota final

Outras dicas

Eu acredito que esses seriam bitfields.

A rigor, um campo de bits deve ser um int, sem assinatura int, ou _Bool. Embora a maioria dos compiladores irá tomar qualquer tipo integral.

Ref C11 6.7.2.1:

Um pouco-campo deve ter um tipo que é um qualificado ou não qualificado versão do _Bool, assinado int, sem assinatura int, ou algum outro Tipo definido pela implementação.

O seu compilador irá provavelmente alocar 1 byte de armazenamento, mas é livre para pegar mais.

Ref C11 6.7.2.1:

Uma implementação pode alocar qualquer unidade de armazenamento endereçável grande o suficiente para manter um campo de bits.

A poupança vem quando você tem vários bitfields que são declaradas um após o outro. Neste caso, o armazenamento alocado será embalada se possível.

Ref C11 6.7.2.1:

Se suficientes restos de espaço, um pouco-campo que segue imediatamente um outro bocado de campo em uma estrutura devem ser embalados em bits adjacentes da mesma unidade. Se restos de espaço insuficiente, se um bit-campo que não cabe é colocado na próxima unidade ou sobreposições unidades adjacentes é definido pela implementação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top