【问题标题】:C struct vs union in regard to bitfields关于位域的 C struct vs union
【发布时间】:2018-12-21 14:11:49
【问题描述】:

诚然,这是一个非常愚蠢的问题,但我前几天也在考虑这个问题。有时在源代码中我会看到这样定义的寄存器:

union
{
   uint8_t byte;
   struct
   {
      uint8_t bit1   :1;
      uint8_t bit2   :1;
      uint8_t bit3_4 :2;
      uint8_t rsvd   :4;
   } bitfield;
} SomeReg_t;

其他时候我只看到一个标准结构:

struct
{
   uint8_t bit1   :1;
   uint8_t bit2   :1;
   uint8_t bit3_4 :2;
   uint8_t rsvd   :4;
} SomeReg_t;

我写了一个简单的例子来说明我的意思:

https://onlinegdb.com/r1H3Xuqe4

问题是,关于位域,这两个定义有什么区别。您何时将一个与另一个用于位域。

【问题讨论】:

标签: c embedded


【解决方案1】:

很容易解释

如果您还想读取或分配整个字节,Union 很方便。

例如

typedef union
{
   uint8_t byte;
   struct
   {
      uint8_t bit1   :1;
      uint8_t bit2   :1;
      uint8_t bit3_4 :2;
      uint8_t rsvd   :4;
   } bitfield;
} SomeReg_t;

SomeReg_t reg;

reg.bitfield.bit1 = 1;
/*...*/
printf("The reg value is %hhx\n", reg.byte);


reg.byte = ReadFormPeriph();

if(reg.bitfield.rsvd == 0b1011)
{
    /* do something */
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2011-03-07
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多