Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

223
Visualizações
el tamaño de una estructura que contiene campos de bits

Tengo una struct de la siguiente manera.

 struct A { uint32_t a : 1; uint32_t b : 1; };

¿ struct A está garantizada por el estándar para tener tamaño 4? ¿Es posible que un compilador use solo un byte para la struct A ya que usa exactamente dos bits?

 struct B { uint32_t a : 1; uint32_t b : 1; uint32_t c : 30; } b;

Si me gustaría establecer los campos de bits en b en cero, ya que sizeof(struct B) = 4 , me parece bien hacerlo por *(uint32_t*)&b = 0 . Pero vi muchas discusiones sobre SO argumentando que tal puntero es una mala práctica. Me pregunto qué hace que *(uint32_t*)&b = 0 sea malo aquí y qué debo hacer (sé que puedo usar memset para restablecer los campos de bits, pero estoy interesado en otras formas portátiles).

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

La primera pregunta, puede agregar una alineación, pero esto afectará la eficiencia de ejecución:

 #pragma pack(push) #pragma pack(1) struct A { uint32_t a : 1; uint32_t b : 1; }; #pragma pack(pop)

La segunda pregunta, puedes definirla como unión.

 union B { struct { uint32_t a : 1; uint32_t b : 1; uint32_t c : 30; }; uint32_t u; } b; // set the bitfields in b to zero bu = 0;
over 4 years ago · Santiago Trujillo Relatório

0

¿ struct A está garantizada por el estándar para tener tamaño 4?

No. Puede ser talla 4, puede que no.

¿Es posible que un compilador use solo un byte para la estructura A ya que usa exactamente dos bits?

Sí, es posible .

Me pregunto qué hace que *(uint32_t*)&b = 0 sea malo aquí...

  • La asignación puede ser insuficiente para poner a cero b .
  • Raro: el tipo opcional uint32_t puede no existir.
  • El código corre el riesgo de problemas de alias.

... y lo que debo hacer

Para poner a cero b , asigne una struct B que sea cero. Investiga el literal compuesto . Tenga en cuenta que este código a continuación se aplica a varios tipos, no solo a struct con campos de bits .

 b = (struct B){0};

O tal vez, si desea un valor distinto de cero:

 b = (struct B){.a = 0, .c = 42, .b = 1};

Los campos de bits son complicados. Use signed int unsigned int y _Bool y no uint32_t para una portabilidad máxima.

Un campo de bits debe tener un tipo que sea una versión calificada o no calificada de _Bool , signed int unsigned int o algún otro tipo definido por la implementación. Está definido por la implementación si se permiten tipos atómicos. C17dr § 6.7.2.1 5

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda