【问题标题】:How the elements are stored in bit-field元素如何存储在位域中
【发布时间】:2020-06-13 12:59:29
【问题描述】:

最近我遇到了一个位域问题

union u
{
    struct
    {
        unsigned char x : 2;
        unsigned int y : 2;
    }p;
    int x;
};
int main()
{
    union u u = { 2 };
    printf("%d\n", u.p.x);
}

它的打印 2 实际上是按照小端规则。位域 y 应该被分配 2 为什么将 2 分配给 x

【问题讨论】:

  • 你试过printf("%zu\n", sizeof u);吗?这告诉了你关于unsigned char x : 2;unsigned int y : 2; 的什么信息?它与字节顺序无关。
  • 你认为“小端规则”是什么?
  • size 是 8 怎么办?因为 char 是 1 byte 而 int 是 4 。即使使用位域,看起来结构填充也会出现。

标签: c bit-fields


【解决方案1】:

使用时

union u u = { 2 };

根据

,您实际上是在分配成员u.p.x,因为它是struct p 的第一个成员

初始化联合时,初始化器列表必须只有一个成员,它初始化联合的第一个成员,除非使用指定的初始化器(自 C99 起)。 cppreference

如果你想初始化u.p.y,请使用:

union u u =  { {.y = 2} };

union u ux = { .p={ 0,2 } };

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 2019-08-16
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2020-02-20
    • 2018-08-15
    相关资源
    最近更新 更多