请帮我解决下面与代码片段相关的逻辑。我得到的输出是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;
}

最佳答案

首先,

因为声明

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

您的位字段bit将具有16位的位字段,其排列方式如下
00000000 00000000
ccccccbb bbbaaaaa

其次,由于输入为{1,3,3},因此将1分配给a,3到b,将另一个3分配给c,使它变成这样
00001100 01100001
ccccccbb bbbaaaaa

第三,因为p只是字符指针,所以它最初将使用两个字节中的最后一个字节(8位),该地址的地址采用小尾数格式(编辑:尽管实现/与平台相关,请参见注释和另一个答案)抽象),因此,p指向


01100001
bbbaaaaa

但是第四,您增加了p!因此,以小端序格式,它现在指向
00001100
ccccccbb

最后,打印出p所指向的值。显然,00001100就是十进制值12的位表示形式。这就是为什么得到12的原因。

关于c - 具有无符号变量的结构位字段的C代码段行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34372783/

10-11 03:26