位字段并集的大小,其成员数多于其大小

jus*_*guy 0 c unions

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出为1个字节.

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

UPDATE

谢谢你清除我的困惑.一个问题:这些位以什么顺序存储在内存中?假设它是小端存储器,那么0xabcd将作为0xd,0xc,0xb,0xa存储在存储器中.

  1. m.a1会成为0xd OR oxa的一部分吗?
  2. 它是0xd(或0xa)的第3位还是第0位?

cxw*_*cxw 5

@tkausl是对的.在a中union,每个成员与内存中的所有其他成员重叠.因此,取决于每个字段中的比特数和平台的字节顺序,位域中的每个字段与其他字段重叠.例如,a1并且a10可能总是具有相同的值.

由于所有字段都在内存中重叠,因此只需要保存最长字段所需的字节数.因为一个字节会这样做,那就是它的大小union.