我有以下程序。
#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;
}
给出以下输出
abc1.ar:wasim
abc1.i:5
abc1.j:2
abc1.k:3
[
[05 00 00 00]
[77 61 73 69]
[6d 00 00 00]
[0000 02]] ]
如何将2和3作为02和06存储在内存中。 奇数大小的位域大小多于存储在存储器中的一个字节?
答案 0 :(得分:1)
编译器在最后两个字节中按如下方式打包位域:
JJJJJJJJ00000KKKJ
00000010000000110 = 02 06
其中最后的J是j的最重要位。请注意,关于位域的几乎所有内容都是实现定义的或未指定的,因此您不能依赖于此。如果您需要完全控制布局,请不要使用位域,但不使用无符号类型和位移以及屏蔽。