O que faz um cólon numa declaração significativo estrutura, tais como: 1,: 7,: 16, ou: 32?
-
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.
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.