gpt4 book ai didi

c - 具有位域的 union 成员的值

转载 作者:行者123 更新时间:2023-12-02 09:51:09 26 4
gpt4 key购买 nike

我正在尝试了解如何为包含位字段的 union 分配内存。

我查看了与此类似的帖子和问题,并且了解到大多数情况下都会涉及填充,具体取决于结构中声明成员的顺序。

1.

union Example
{ int i:2;
int j:9;
};


int main(void)
{
union Example ex;
ex.j=15;
printf("%d",ex.i);
}

输出:-1

2.

union Example
{ unsigned int i:2;
int j:9;
};


int main(void)
{
union Example ex;
ex.j=15;
printf("%d",ex.i);
}

输出:3

有人可以解释一下输出吗?这只是这种情况下的标准输出吗?我使用的是ubuntu内置的gcc编译器

最佳答案

编译器为 union 中的位字段分配位的方式恰好与 j 的低位与 i 的位重叠。因此,当j设置为15时,i的两位都设置为1。

i是使用int i:2声明的两位有符号整数时,编译器将其解释为两位二进制补码数。按照这种解释,位 11 代表 -1。

i是两位无符号整数,用unsigned int i:2声明时,它是纯二进制,没有符号位。按照这种解释,位 11 代表 3。

下面的程序显示,将有符号的两位整数设置为 -1 或将无符号的两位整数设置为 3 会在 union 中产生相同的位模式,至少在 C 实现中是这样。

#include <stdio.h>


int main(void)
{
union Example
{
unsigned u;
int i : 2;
int j : 9;
unsigned int k : 2;
} ex;

ex.u = 0;
ex.i = -1;
printf("ex.i = -1: %#x.\n", ex.u);

ex.u = 0;
ex.j = 15;
printf("ex.j = 15: %#x.\n", ex.u);

ex.u = 0;
ex.k = 3;
printf("ex.k = 3: %#x.\n", ex.u);
}

输出:

ex.i = -1:  0x3.ex.j = 15:  0xf.ex.k =  3:  0x3.

请注意,编译器也可以从高到低而不是从低到高分配位,在这种情况下,j 的高位将与 i 重叠>,而不是低位。此外,编译器可以为九位 j 使用与两位 i 不同大小的存储单元,在这种情况下,它们的位可能不会重叠全部。 (例如,它可能使用单个八位字节表示 i,但使用 32 位字表示 j。八位字节将与32 位字,但不一定是用于 j 的部分。)

关于c - 具有位域的 union 成员的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55997812/

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