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

変数がポインタbp が指す場所に配置され、 *p がbit1.

あなたの場合b=3 (000011)

しかし、2バイトには、

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 に答える