gpt4 book ai didi

c - 为什么这个 union 的大小是 2 位域?

转载 作者:太空狗 更新时间:2023-10-29 15:45:41 25 4
gpt4 key购买 nike

我正在 windows 上使用 turbo C,其中 char 占一个字节。现在我的问题是下面的 union 。

union a
{
unsigned char c:2;
}b;
void main()
{
printf("%d",sizeof(b)); \\or even sizeof(union a)
}

这个程序将输出打印为 2,其中 union 应该只占用 1 个字节。为什么会这样?

对于结构,给出 1 个字节没问题,但这个 union 工作不当。

还有一件事如何访问这些位字段。

scanf("%d",&b.c);  //even scanf("%x",b.c);

不工作,因为我们没有位地址。所以我们必须使用另一个变量,如下所示

int x;
scanf("%d",&x);
b.c=x;

我们就不能避免吗??还有别的办法吗???

最佳答案

允许编译器向结构和 union 添加填充,同时,我承认,当您能够获得一个字节的结构时,您确实将 union 四舍五入为两个字节的大小有点令人惊讶,这是完全允许的.

回答你的第二个问题:不,这是不可避免的。位字段是一种结构打包优化,而付出的性能和便利性代价是位字段成员不可单独寻址。

关于c - 为什么这个 union 的大小是 2 位域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/289900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com