Вы можете сделать это, поместив биты в структуру внутри объединения, но это может работать или не работать, в зависимости от вашей реализации. Определение языка не указывает, в каком порядке отдельные биты будут сопоставляться с битами unsigned char
; хуже того, он даже не гарантирует, что биты будут перекрываться с unsigned char
(компилятор может решить разместить отдельные биты в направлении наиболее значимой стороны слова и unsigned char
в направлении наименее значимой стороны или наоборот) .
Обычная техника в вашей ситуации - использовать побитовые операции. Определите константы, названные по значению битов, например,
#define FLAG_BUSY 0x01
#define FLAG_DATA_AVAILABLE 0x02
#define FLAG_TRANSMISSION_IN_PROGRESS 0x04
...
#define FLAG_ERROR 0x80
Затем прочитать и записать отдельные биты:
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 */