2

你能解释一下为什么这段代码的输出是 12 (1100b)

以及 sizeof(bit1) 是 4byte 的?

#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));            
}
4

2 回答 2

2

您已将位字段声明为unsigned. 在大多数现代系统上,这是一个 32 位整数。(unsigned short 是 16、char 8、long 64 等)所以,您声明的是 32 位位域容器。每个单独的位域参数的大小由位域名称后面的整数给出,但它们所在容器的大小是指定数据类型的倍数……通常是指示的总位数的最小倍数适合——尽管单词边界和其他东西会起作用。

我很惊讶它的其余部分都可以正常工作。除了指针中的转换问题之外,printf 正在打印整个字段的前 8 位......一个单个字符。这不会在位字段本身上中断,而是在字节/字符内存边界上中断。根据您的系统是大端还是小端,它将是整个字段的 MSB 或 LSB。

于 2013-04-12T17:14:44.283 回答
1

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

我相信您的系统几乎没有字节序寻址,因此变量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

该结构将,和bitfield打包成一个无符号整数。无符号整数的大小为4 字节acb

于 2013-04-12T17:37:17.740 回答