C 当位字段大于字节大小时,endianness如何影响位字段

C 当位字段大于字节大小时,endianness如何影响位字段,c,struct,endianness,bit-fields,C,Struct,Endianness,Bit Fields,我有以下程序 #include<stdio.h> #include<string.h>

我有以下程序

#include<stdio.h>                                                                                                                                                                                    
#include<string.h>                                                                                                                                                                                   

struct abc {                                                                                                                                                                                         
  int i;                                                                                                                                                                                             
  char ar[10];                                                                                                                                                                                       
  int j:9;                                                                                                                                                                                           
  int k:3;                                                                                                                                                                                           
}abc1;                                                                                                                                                                                               


void wasim_dump_data(const void *object, size_t size)
{                                                    
  int i;                                             
  printf("[ \n");                                    
  for(i = 0; i < size; i++)                          
  {                                                  
    if (i%4 ==0)                                     
      printf("[ ");                                  
    printf("%02x ", ((const unsigned char *) object)[i] & 0xff);
    if ((i+1)%4 == 0)                                           
      printf("]\n");                                            
  }                                                             
  printf("]\n");                                                

}

int main ()
{          
  strcpy (abc1.ar, "wasim");
  abc1.i=5;                 
  abc1.j=2;                 
  abc1.k=3;                 

  struct abc * p1 = &abc1;
  printf("abc1.ar : %s\nabc1.i : %d\nabc1.j : %d\nabc1.k : %d\n",abc1.ar, abc1.i, abc1.j, abc1.k);
  wasim_dump_data (p1,sizeof(abc1));                                                              

  return 0;
}
#包括
#包括
结构abc{
int i;
char-ar[10];
国际期刊:9;
INTK:3;
}abc1;
void wasim\u dump\u数据(常量void*对象,大小)
{                                                    
int i;
printf(“[\n”);
对于(i=0;i
这将给出以下输出

abc1.ar:wasim
abc1.i:5
abc1.j:2
abc1.k:3
[
[05 00]
[77 61 73 69]
[6d 00 00]
[00 02 06]
]

为什么2和3会像02和06一样存储在内存中。
存储在内存中的大小超过一个字节的奇数位字段有多大?

编译器在最后两个字节中按如下方式打包位字段:

  JJJJJJJJ00000KKKJ
  00000010000000110 = 02 06

其中,最后的J是J的最高有效位。请注意,几乎所有关于位字段的内容都是实现定义的或未指定的,因此您不能依赖于此。如果您需要完全控制布局,请不要使用位字段,而是使用无符号类型和位移位加掩蔽。

是的,可能会重复。但我的实际问题是,如果比特数超过8,编译器将如何打包。答案是:“随它喜欢”。非常感谢。你能告诉我为什么整数被压缩到16位吗?这是未指定的。编译器编写器可以自由选择。显然,她选择了最小尺寸的包装。自3+9以来