2015-12-19 48 views
2

请帮我用下面的代码片段相关的逻辑。我得到的输出是12 8*p怎么是12? 我理解它的大小为8,但我忐忑与*p显示值。Ç摘录行为

int main()  
{  
    struct bitfield 
    { 
     unsigned a:5; 
     unsigned c:5; 
     unsigned b:6; 
    } bit; 

    char *p; 

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

    p=(char*)&bit1; 

    p++; 

    printf("%d\t%d",*p,sizeof(bit1)); 

    getchar(); 

    return 0; 
} 
+0

注意,几乎一切都与位域w.r.t内存配置等是实现定义。通过'char *'访问位域值是最好的实现。在某些类型的处理器上显示的值全部为零是肯定可行的。 –

回答

3

首先,

因为声明的

struct bitfield 
{ 
    unsigned a:5; 
    unsigned c:5; 
    unsigned b:6; 
}bit; 

你的位域bit将不得不与这样的

00000000 00000000 
ccccccbb bbbaaaaa 

其次安排16位的位字段,因为输入是{1,3,3},所以1将被分配给a,3到b和另一个3至C,使得它变成了这个样子

00001100 01100001 
ccccccbb bbbaaaaa 

第三,因为P是只是字符指针,它会原本采取两个之间最后一个字节(8位),它具有较小的地址小端格式(编辑:尽管实现/平台的依赖性,见注释,从抽象另一个答案)从MDSN

,因此,p指向

附加说明

8086系列处理器的存储的低字节整数值 高字节之前

01100001 
bbbaaaaa 

但第四,你增加P!因此,现在指向

00001100 
ccccccbb 

然后最后,打印p指向的值。很显然,00001100无非是十进制值12位表示这就是为什么你会得到12

+0

很好解释。谢谢伊恩。 – honeytechiebee

+0

没问题,我很高兴你觉得它有用。它曾经让我感到困惑。 =) – Ian

+0

注意,这个布局,像几乎一切都与位域,实现特定的。位的布局,包装等取决于实现。 –

3

这是很平台/实现相关的代码。假设值是紧凑的16位整数,字节顺序是小端,然后你的价值观应该像(左 - >右|更低的内存地址 - >更高的内存地址)

1  3  3 
    ||  || || 
10000 110 00 110000 
    ^^^ 
    5 8 10 

现在00110000是12(记号从左至右最低到最高显著和00001100标准符号)。而你的p点后第一个8位,因为你增加它。