Puede hacerlo colocando los bits en una estructura dentro de la unión, pero puede funcionar o no, según su implementación. La definición del lenguaje no especifica en qué orden los bits separados se emparejarán con los bits del unsigned char
; peor aún, ni siquiera garantiza que los bits se superpongan con el unsigned char
(el compilador puede decidir colocar los bits separados hacia el lado más significativo de una palabra y el unsigned char
hacia el lado menos significativo o viceversa).
La técnica habitual en su caso es utilizar operaciones bit a bit. Definir constantes con nombre después de que el significado de los bits, por ejemplo,
#define FLAG_BUSY 0x01
#define FLAG_DATA_AVAILABLE 0x02
#define FLAG_TRANSMISSION_IN_PROGRESS 0x04
...
#define FLAG_ERROR 0x80
Luego de leer y escribir bits individuales:
if (status & FLAG_BUSY) ... /* test if the device is busy */
status &= ~FLAG_ERROR; /* turn off error flag */
status |= FLAG_TRANSMISSION_IN_PROGRESS /* turn on transmission-in-progress flag */
C99 6.7.2.1/10: "Una implementación puede asignar cualquier unidad de almacenamiento direccionable lo suficientemente grande como para contener un campo de bits". No es necesario asignar un solo 'char', por lo que es posible que no se produzca ningún aliasing. Además, la norma exige estructuras anónimas dentro de la unión. – Potatoswatter
¿Tiene que nombrar la estructura? – jjxtra