我不明白这个 C 代码的行为(联合 2 个位域结构,一个字和一个字节数组)
I don't understand the behavior of this C code (union with 2 bit-field structs, a word and a byte array)
我在 C 中有以下代码:
typedef union _REG_CiFIFOCON {
struct {
uint32_t RxNotEmptyIE : 1;
uint32_t RxHalfFullIE : 1;
uint32_t RxFullIE : 1;
uint32_t RxOverFlowIE : 1;
uint32_t unimplemented1 : 1;
uint32_t RxTimeStampEnable : 1;
uint32_t unimplemented2 : 1;
uint32_t TxEnable : 1;
uint32_t UINC : 1;
uint32_t unimplemented3 : 1;
uint32_t FRESET : 1;
uint32_t unimplemented4 : 13;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} rxBF;
struct {
uint32_t TxNotFullIE : 1;
uint32_t TxHalfFullIE : 1;
uint32_t TxEmptyIE : 1;
uint32_t unimplemented1 : 1;
uint32_t TxAttemptIE : 1;
uint32_t unimplemented2 : 1;
uint32_t RTREnable : 1;
uint32_t TxEnable : 1;
uint32_t UINC : 1;
uint32_t TxRequest : 1;
uint32_t FRESET : 1;
uint32_t unimplemented3 : 5;
uint32_t TxPriority : 5;
uint32_t TxAttempts : 2;
uint32_t unimplemented4 : 1;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} txBF;
uint32_t word;
uint8_t byte[4];
} REG_CiFIFOCON;
两个结构都是32位的,所以是字变量和字节数组(因为这是由4个字节组成的。4x8 = 32位)。
我的问题是:我不明白这个工会的行为。我知道如何访问每个结构中的位以及字和数组,但它们有什么关系?我知道如果只有 1 个结构和单词,将单词设置为某个值会相应地修改位字段(反之亦然),但我不知道在这种情况下会发生什么。
谢谢你,祝你有愉快的一天!
你在同一个联合中有 4 种类型。他们都在使用相同的内存。
改变其中的哪一个并不重要 - 它会影响其他。
您的类型的大小是 32 个字节 - 在您的情况下,这也是其中每个类型的大小。否则 - 它将是里面最大类型的大小。
我在 C 中有以下代码:
typedef union _REG_CiFIFOCON {
struct {
uint32_t RxNotEmptyIE : 1;
uint32_t RxHalfFullIE : 1;
uint32_t RxFullIE : 1;
uint32_t RxOverFlowIE : 1;
uint32_t unimplemented1 : 1;
uint32_t RxTimeStampEnable : 1;
uint32_t unimplemented2 : 1;
uint32_t TxEnable : 1;
uint32_t UINC : 1;
uint32_t unimplemented3 : 1;
uint32_t FRESET : 1;
uint32_t unimplemented4 : 13;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} rxBF;
struct {
uint32_t TxNotFullIE : 1;
uint32_t TxHalfFullIE : 1;
uint32_t TxEmptyIE : 1;
uint32_t unimplemented1 : 1;
uint32_t TxAttemptIE : 1;
uint32_t unimplemented2 : 1;
uint32_t RTREnable : 1;
uint32_t TxEnable : 1;
uint32_t UINC : 1;
uint32_t TxRequest : 1;
uint32_t FRESET : 1;
uint32_t unimplemented3 : 5;
uint32_t TxPriority : 5;
uint32_t TxAttempts : 2;
uint32_t unimplemented4 : 1;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} txBF;
uint32_t word;
uint8_t byte[4];
} REG_CiFIFOCON;
两个结构都是32位的,所以是字变量和字节数组(因为这是由4个字节组成的。4x8 = 32位)。
我的问题是:我不明白这个工会的行为。我知道如何访问每个结构中的位以及字和数组,但它们有什么关系?我知道如果只有 1 个结构和单词,将单词设置为某个值会相应地修改位字段(反之亦然),但我不知道在这种情况下会发生什么。
谢谢你,祝你有愉快的一天!
你在同一个联合中有 4 种类型。他们都在使用相同的内存。
改变其中的哪一个并不重要 - 它会影响其他。
您的类型的大小是 32 个字节 - 在您的情况下,这也是其中每个类型的大小。否则 - 它将是里面最大类型的大小。