Mais sobre bitfields

Me disseram que gostaram da dica sobre o tratamento de tipos dentro de bitfields, especialmente com relação aos sinais de valores inteiros. Eis uma dica adicional sobre bitfields que pode te interessar.

Segundo a especificação ISO C99 as regras para a alocação de bitfields é bem definida:

  • Tipos sem especificação de bitfield são alocados isoladamente;
  • Tipos com espeficação de bitfield são alocados juntos, sempre que possível;
  • É possível a especificação de campos anônimos com especificação de bitfield e;
  • A especificação anônima pode receber a especificação de bitfield zerada, indicando que o próximo bitfield será alocado no próximo byte.

Assim, a especificação de bitfields como em:

struct S {
  int a:7;
  int b:12;
  int :0;  /* bitfield anônimo! */
  short c:9;
};

Alocará 6 bytes, onde os primeiros 19 bits serão alocados para a e b, os 13 bits restantes são deixados de lado e nos últimos 2 bytes (do tipo short) apenas os 9 bits iniciais serão usados.

O bitfield anônimo diferente de zero pode ser usado para “pular” alguns bits na estrutura:

struct S {
  int a:7;
  int b:12;
  int :3;  /* Esses 3 bits não nos interessam! */
  int c:7;
};

A estrutura acima terá 4 bytes de tamanho (o do tipo int) e usará 29 bits, mas os bits de 19 até 21 e de 29 até 31 serão ignorados pelo compilador.

Atenção: Isso faz parte da especificação! Está presente em qualquer compilador C que implemente ISO C11. Outro ponto é que bitfields zerados só são possíveis em bitfields anônimos. Você não pode fazer “int x:0” dentro de uma estrutura. Você pode fazer “struct S { int :0; };, mas isso ai é um comportamento indefinido e não deve ser usado.

Anúncios