C 成员数大于其大小的位字段联合的大小 #包括 混合工会{ 无符号字符a1:1; 无符号字符a2:4; 无符号字符a3:4; 无符号字符a4:1; 无符号字符a5:4; 无符号字符a6:4; 无符号字符a7:1; 无符号字符a8:4; 无符号字符a9:4; 无符号字符a10:1; 无符号字符a11:4; 无符号字符a12:4; }; int main(){ printf(“Sizeof mix=%d字节\n”,Sizeof(union mix)); 返回0; }

C 成员数大于其大小的位字段联合的大小 #包括 混合工会{ 无符号字符a1:1; 无符号字符a2:4; 无符号字符a3:4; 无符号字符a4:1; 无符号字符a5:4; 无符号字符a6:4; 无符号字符a7:1; 无符号字符a8:4; 无符号字符a9:4; 无符号字符a10:1; 无符号字符a11:4; 无符号字符a12:4; }; int main(){ printf(“Sizeof mix=%d字节\n”,Sizeof(union mix)); 返回0; },c,unions,C,Unions,输出为1字节 超过8位的位字段成员会发生什么情况?显然,我仍然可以为任何位字段成员设置并获取正确的值 更新 谢谢你消除了我的困惑。一个附带的问题:这些位以什么顺序存储在内存中?假设它是一个小的endian内存,那么0xabcd将以0xd、0xc、0xb、0xa的形式存储在内存中 m.a1是0xd还是oxa的一部分 它是0xd(或0xa)的第3位还是第0位 @tkausl是正确的。在联合中,每个成员与内存中的所有其他成员重叠。因此,根据每个字段中的位数和平台的端度,位字段中的每个字段与其他字段重叠

输出为1字节

超过8位的位字段成员会发生什么情况?显然,我仍然可以为任何位字段成员设置并获取正确的值

更新

谢谢你消除了我的困惑。一个附带的问题:这些位以什么顺序存储在内存中?假设它是一个小的endian内存,那么0xabcd将以0xd、0xc、0xb、0xa的形式存储在内存中

  • m.a1是0xd还是oxa的一部分
  • 它是0xd(或0xa)的第3位还是第0位

  • @tkausl是正确的。在
    联合中
    ,每个成员与内存中的所有其他成员重叠。因此,根据每个字段中的位数和平台的端度,位字段中的每个字段与其他字段重叠。例如,
    a1
    a10
    可能总是具有相同的值

    因为所有字段在内存中都是重叠的,所以您只需要保存最长字段所需的字节数。因为一个字节就可以了,所以这就是
    联合的大小

    位以什么顺序存储在内存中

    这是定义的实现。

    根据6.7.2.1结构和联合规范,第11段:

    一个实现可以分配任何大的可寻址存储单元 足够容纳一个位域。如果还有足够的空间,请输入一个位字段 结构中紧跟在另一位字段之后的 压缩到同一单元的相邻位中。如果空间不够 保留,无论是否将不适合的位字段放入 下一个单元或与相邻单元重叠的单元为 实现定义位字段的分配顺序 单元内(高阶到低阶或低阶到高阶) 已定义实现。可寻址 未指定存储单元

    不同的编译器可以实现不同的位字段。请注意,高阶和低阶与big-endian或little-endian不同。8位
    无符号字符
    的低位是在打开和关闭时向其值添加
    1
    的低位。同一个8位
    无符号字符
    的高阶位是在其打开时向其值添加128的位


    因此,位字段有两种实现定义的顺序:平台/硬件定义的端序和编译器定义的高或低阶赋值。您还可以选择位字段之间的填充,以及它们是否跨越位字段的实现定义细节的相邻单元。

    没有超过8位的成员<代码>联合
    !=
    struct
    @tkausl明白了。。混合使用struct/union/bit字段使我感到困惑:)谢谢。你似乎把工会的规模和工会成员的规模搞混了。通常,union的大小等于其最大成员的大小—在本例中是一个字节,因为所有成员都是字符(四舍五入到字节大小,因为它是实际大小的最小单位)
    #include <stdio.h>
    
    union mix {
      unsigned char a1:1;  
      unsigned char a2:4;
      unsigned char a3:4;    
      unsigned char a4:1;  
      unsigned char a5:4;
      unsigned char a6:4;    
      unsigned char a7:1;  
      unsigned char a8:4;
      unsigned char a9:4;    
      unsigned char a10:1;  
      unsigned char a11:4;
      unsigned char a12:4;       
    };
    
    int main() {
    
        printf("Sizeof mix = %d bytes\n", sizeof(union mix));
    
        return 0;
    }