0

私はこのプログラムを書きました:

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

struct A {
  bool a;
  bool b;
  bool c;
  bool d;
};

struct B {
  int a;
};

int main() {
  struct A* pa = malloc( sizeof(struct A) );
  struct B* pb = (struct B*) pa;
  pa->a = 0;
  pa->b = 1;
  pa->c = 0;
  pa->d = 0;

  printf("value of pint is %i\n", pb->a);
  return 0;
}

2 (0010) が出力されることを期待していますが、出力は 256 です。

4

5 に答える 5

3

2 (0010) が出力されることを期待していますが、出力は 256 です。

Aboolは少なくとも 1 バイトを占めます。あなたの場合、明らかに正確に1バイトで、プラットフォームはリトルエンディアンです( 8-bit char)。したがって、2 番目 (最下位) のバイトは 1 で、他のすべてのバイトは 0 になり1*256ます。

とを介したタイプパニングは、厳密なエイリアシングpaに違反していることに注意してください。pb

union移植可能な型しゃれにa を使用します。

于 2013-05-28T11:49:44.777 に答える
1

%i 整数を出力します。

bool は、値 0 と 1 を格納するのに十分な大きさの符号なし整数型です。

次の方法で bool を出力できます。

printf("%d\n", b);
于 2013-05-28T11:50:08.577 に答える
0

試す

struct A {
  bool a:1;
  bool b:1;
  bool c:1;
  bool d:1;
};

一部強制コンパイラは:1、メンバー変数ごとに 1 バイトではなく 1 ビットを割り当てるため、構造体 A のメモリ レイアウトは次のようになります (リトル エンディアンを想定)。

|-byte 1-|-byte 2-|-byte 3-|-byte 3-|
 uuuudcba uuuuuuuu uuuuuuuu uuuuuuuu

u未使用のために寄付する場所。整数にキャストすると、次の整数ビューが得られます。

uuuuuuuu uuuuuuuu uuuuuuuu uuuudcba

また、コンパイラの実装が異なるとビット順序が異なるため、結果が 2 (0010) ではなく逆の 4 (0100) になる場合もあります。

于 2013-05-28T11:49:20.103 に答える