在bitfield中无法预测的答案

时间:2013-04-12 17:07:43

标签: c

请您解释一下为什么此代码的输出为12(1100b)

以及sizeof(第1位)是4字节???

#include <stdio.h>
#include <stdlib.h>
struct bitfield
  {
   unsigned a:5;
   unsigned c:5;
   unsigned b:6;

  };

void main()
{

 char *p;
 struct bitfield bit1={1,3,3};  //a=00001 ,c=00011 ,b=000011
 p=&bit1;                           // p get the address of bit1
 p++;                               // incriment the address of p in 1

 printf("%d\n",*p); 

 printf("%d\n",sizeof(bit1));            
}

2 个答案:

答案 0 :(得分:2)

您已将位字段声明为unsigned。在大多数现代系统中,这是一个32位整数。 (unsigned short是16,char 8,long 64等)所以,你要声明一个32位的bitfield容器。每个单独位字段参数的大小由位域名称后面的整数给出,但是它们打包的容器大小是指定数据类型的倍数...通常是指示的总位数的最小倍数适应 - 虽然词边界和其他东西将发挥作用。

我很惊讶其余部分都有效。除了指针中的转换问题外,printf还打印整个字段的前8位......一个字符。这不会破坏位字段本身,而是在字节/字符存储器边界上。根据您的系统是大端还是小端,它将是整个字段的MSB或LSB。

答案 1 :(得分:1)

指针p包含结构变量bit1的地址。

我相信你的系统正在进行 little endian 寻址,因为变量b被放置在指针p指向的位置,而* p打印出前两个字节的内容bit1

在您的情况下b=3 (000011)

但这两个字节包含,

00000000 00001100  (12)
         ------
            ^
            |
         Value of b

为了更好地理解这一点,

b的值更改为5(000101),如下所示,

struct bitfield bit1={1,1,5}; 

然后你的输出将是20,因为,

00000000 00010100  (20)
         ------
           ^
           |
        Value of b

结构bitfieldacb打包成一个无符号整数。无符号整数的大小为 4字节