位字段和联合大小

use*_*100 2 c

#include<stdio.h>
main()
{
    union d
    {
        unsigned int a:1;
        unsigned int b:3;
        unsigned :0;
        unsigned int d:1;
        unsigned int e:1;
    };
    union d aa;
    aa.b=9;
    printf("d.aa.a=%d d.aa.b=%d",aa.a, aa.b);
system("pause");
}
Run Code Online (Sandbox Code Playgroud)

在此问题中,联合的大小将不同于为联合分配的位字段数。谁能解释这个区别..剩余的内存又如何处理?

jxh*_*jxh 5

关于包含位字段的类型的大小,标准规定为(C11 6.7.2.1 p11):

一个实现可以分配任何足够大的可寻址存储单元以容纳位字段。

由于这是一个union,并且联合中的所有成员仅使用不超过的3位unsigned int,因此的大小union至少应为if的大小char,以及系统要求的填充(如果有)。在许多系统上,它会将每个单元填充到位域所针对的类型的大小,因此在这种情况下,我希望的大小union与的大小相同unsigned int(尽管可能由于还是要达到正常的union填充要求)。

该0大小的位字段是一个红鲱鱼的union,但它有一个特殊的含义struct(C11 6.7.2.1 P12):

没有声明符但只有一个冒号和一个宽度的位域声明表示未命名的位域。作为特殊情况,宽度为0的位域结构构件表示没有其他位域要打包到放置前一个位域(如果有)的单元中。

因此,如果您union是一个struct:

struct d
{
    unsigned int a:1;
    unsigned int b:3;
    unsigned :0;
    unsigned int d:1;
    unsigned int e:1;
};
Run Code Online (Sandbox Code Playgroud)

然后,其大小struct将至少为2 chars(如果需要,加上其他填充)。在大多数情况下,它实际上会达到2 unsigned ints 的大小。