Los campos de bits (bit fields) en C son miembros de una estructura que ocupan una cantidad específica de bits en lugar del tamaño estándar del tipo. Permiten ahorrar memoria, especialmente para el almacenamiento de flags y conjuntos compactos de estados.
Declaración:
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
En este ejemplo, la estructura ocupa un mínimo de 8 bits en lugar de 3 * sizeof(unsigned int).
Dónde aplicar:
Limitaciones y puntos críticos:
Ejemplo:
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
Pregunta: ¿Se puede usar el tipo char o signed int para campos de bits?
Respuesta: El estándar C permite el uso de int, unsigned int y (debido a extensiones de compiladores) otros tipos enteros estándar (char, short). Sin embargo, la portabilidad está garantizada solo para int y unsigned int.
Ejemplo de error:
struct Example { signed char a : 3; }; // En diferentes compiladores/arquitecturas, las reglas de almacenamiento del signo y el orden de los bits son diferentes.
Historia
Al integrar software en ARM y x86 se descubrió que la estructura con campos de bits se descomprimía de manera diferente: diferentes órdenes de bits y alineación. Se diseñó sin tener en cuenta estas diferencias, lo que llevó a la imposibilidad de leer los datos en un entorno multiplataforma.
Historia
En el sistema de control de controladores de motores, se usó erróneamente el tipo
charen estructuras de campos de bits. En algunos procesadores ARM, esto provocaba una extensión de signo incorrecta, lo que conducía a un procesamiento erróneo de los flags.
Historia
En un protocolo de red se usaron campos de bits para empaquetar flags de mensajes; no se tuvo en cuenta que los campos no inicializados más significativos permanecen en estado basura. Al transmitir entre dispositivos, se produjeron errores aleatorios de estado debido a diferencias en la inicialización.