Таинственное поведение в битовых полях

У меня есть битовые поля, как показано ниже

union
{
    unsigned int REG;

    struct
    {
        unsigned char toggle : 1;
    } flag;

    struct
    {
        unsigned char field : 3;
        unsigned char count : 3;
    } fields;
} bitfield;

Когда я переключаю бит bitfield.flag.toggle = !bitfield.flag.toggle каждый раз, когда он влияет на bitfield.fields.field т. bitfield.flag.toggle Когда bitfield.flag.toggle равен нулю, bitfield.fields.field также равен нулю и наоборот. Почему это происходит, этого не произойдет, если существует только одна такая struct

union
{
    unsigned int REG;

    struct
    {
        unsigned char toggle : 1;
        unsigned char field : 3;
        unsigned char count : 3;
    } flag;
} bitfield;

Всего 2 ответа


Объединение - это специальный тип данных, доступный в C, который позволяет хранить разные типы данных в одной и той же ячейке памяти. В вашем случае, переключатель и поле используют одни и те же байты. Если вы не хотите такого поведения, вам лучше избегать использования union.


Это поведение союза. REG , flag и fields хранятся в одной и той же ячейке памяти, размер которой самый большой из них. Если вы перезаписываете один, другие тоже будут написаны более. Если вы установите REG например, в 0xffffffff , так что все 1s двоичные, то flag и fields также должны иметь полные 1 в своих двоичных значениях.


Есть идеи?

10000