2

我试图更多地了解位域的工作原理。

给定以下代码:假设 int 为 32 位

#include <stdio.h>

int main()
{
    struct byte
    {
        int one:1;
    };
    struct byte var = {3};
    printf("%d\n", var.one);
    printf("%#x\n", var);
    return 0;
}

我得到的输出是:

-1
0x1

但是我期待看到:

-1
0x3

自从

struct byte var = {3};

将值 3 分配给 int 的 4 个字节,不是吗?

从输出中我实际上得到的似乎是上面的代码行试图将值 3 存储到 1 位字段中,因此打印0x1为第二个输出行。

所以我的问题是:

这些对整个结构的初始化和赋值是如何工作的?

另外,为什么是{}必要的?

4

1 回答 1

4
int one:1;

有了这个,您声明一个只有一位用于该sign位的 int。所以你看-1

如果要存储 3(011),则总共需要 2(数据)+1(符号)位。所以,它应该是:

struct byte
{
int one:3;
};

或者使用无符号整数。

struct byte
{
unsigned int one:2;
};
于 2012-10-04T17:54:10.907 回答