4
#include <stdio.h>

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

    char *ptr;
    struct bitfield bit1={1,3,3};

    ptr=&bit1;
    ptr++;

    printf("%d",*ptr);
    return 0;
}

この質問への出力は 12 です。誰か説明してくれませんか?私はそれを説明するために最善を尽くしました。

4

4 に答える 4

14

この質問に対する説明はかなり単純です:

Binary value of 1 is 00001 (as "a" have 5 bitfield)
Binary value of 3 is 00011 (as "c" have 5 bitfield)
Binary value of 3 is 000011 (as "b" have 6 bitfield)

メモリ レイアウトは次のように視覚化できます。 ここに画像の説明を入力

最初の 5 ビットはa値 00001 で占められています。次に、5 ビットはb値 00011 で占められ、最後の 6 ビットcは値 000011 で占められています。

したがって、開始時のポインターptrはメモリ位置 1000 にあり、今はptr++. sizeof(char)は 1なのでptr、1 メモリ ロケーション分移動します。そのptrため、メモリ位置 1001 に移動します。

したがって*ptr、メモリ位置 1001 に格納されている値が得られるため、答えは 12 になります。

于 2013-06-16T05:23:14.367 に答える
2

a、b、c が格納されている場所を示すプログラム。エンディアン性のために少し混乱することに注意してください。

#include<stdio.h>
#include<string.h>

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

void print_bitfield(unsigned a, unsigned c, unsigned b)
{
    struct bitfield bf;
    memset(&bf, 0, sizeof(bf));
    bf.a = a;
    bf.b = b;
    bf.c = c;

    unsigned char* ptr = (unsigned char*)&bf;
    unsigned i;

    printf("%2x %2x %2x: ", a, c, b);
    for (i = 0; i < sizeof(bf); i++)
    {
        printf("%02x ", ptr[i]);
    }
    printf("\n");
}

int main()
{
    printf("sizeof bitfield: %u\n",sizeof(struct bitfield));

    printf(" a  c  b:  0  1  2  3\n");
    print_bitfield(0,  0, 0);
    print_bitfield(1,  0, 0);
    print_bitfield(31, 0, 0);
    print_bitfield(0,  1, 0);
    print_bitfield(0, 31, 0);
    print_bitfield(0,  0, 1);
    print_bitfield(0,  0, 63);
    print_bitfield(1, 3, 3);
    return 0;
}

出力:

sizeof bitfield: 4
 a  c  b:  0  1  2  3
 0  0  0: 00 00 00 00 
 1  0  0: 01 00 00 00 
1f  0  0: 1f 00 00 00 
 0  1  0: 20 00 00 00 
 0 1f  0: e0 03 00 00 
 0  0  1: 00 04 00 00 
 0  0 3f: 00 fc 00 00 
 1  3  3: 61 0c 00 00 
于 2013-06-16T06:03:38.663 に答える
2

1 は 5 ビットでどのように表されますか? それは00001になり、3 は00011bになります ( 6 つのビットフィールドがあるため、追加のゼロがあることに 注意してください: 000011 )。

のアドレスbit1が 1000 だとしますptr++。1001 になります ( sizeof ptr1 であるため)。

とはどういう*ptr意味ですか? これは、00001100 になる場所 1001の内容を意味します。

バイナリ 00001100 は 10 進数の12です。

于 2013-06-16T05:23:03.340 に答える
2

初期化後のビットフィールドの値は次のとおりです。

000011 00011 00001
^^^^^^ ^^^^^ ^^^^^
b = 3  c = 3 a = 1

幅が 8 ビットであると仮定するとchar、16 ビットを 2 つの 8 ビット部分に分割できます。

00001100 01100011
^^^^^^^^ ^^^^^^^^
 ptr + 1   ptr

したがって、12 である ptr + 1 でオクテットを出力します。

ただし、ビットフィールドのアドレスは使用しないでください (互換のない型のポインターを介してエイリアスを作成することは言うまでもありません... )

于 2013-06-16T05:25:40.117 に答える