我正在 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 个字节。为什么会这样?
对于 struct 来说,给出 1 个字节很好,但是这个 union 工作不正常。
还有一件事是如何访问这些位域。
scanf("%d",&b.c);  //even scanf("%x",b.c);

不工作,因为我们没有位地址。所以我们必须使用另一个变量,如下所示
int x;
scanf("%d",&x);
b.c=x;

我们不能避免吗??有没有其他办法???

最佳答案

Turbo C is based on 8086 microprocessor which has two byte word boundary 。原子读写通常与 CPU 的架构绑定(bind),因此编译器会添加一些松弛字节来对齐您的数据结构。

调用 #pragma pack(1) 可能可以禁用它,但不确定它是否适用于 Turbo C。

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

10-11 22:45
查看更多