31

ビットフィールドに適用すると、Sizeof() は機能しません。

# cat p.c
  #include<stdio.h>
  int main( int argc, char **argv )
  {
    struct { unsigned int bitfield : 3; } s;
    fprintf( stdout, "size=%d\n", sizeof(s.bitfield) );
  }
# gcc p.c -o p
  p.c: In function ‘main’:
  p.c:5: error: ‘sizeof’ applied to a bit-field

...明らかに、浮動小数点の部分サイズなどを返すことができないためです。しかし、それは興味深い質問をもたらしました。Cで、変数/型のビット数を教えてくれる同等のものはありますか? 理想的には、ビットフィールドに加えて、charintなどの通常の型でも機能します。

アップデート:

ビットフィールドの sizeof() に相当する言語がない場合、それを計算する最も効率的な方法は何ですか?実行時に! これに依存するループがあり、ビットフィールドのサイズを変更した場合にループが壊れないようにしたいと想像してください。ビットフィールドのサイズとループの長さをマクロにする公正な不正行為はありません。;-)

4

4 に答える 4

24

C のビット フィールドのサイズを決定することはできませCHAR_BIT<limits.h>。ビット単位のサイズは単純にCHAR_BIT * sizeof(type).

C バイトがオクテットであると想定しないでください。少なくとも8 ビットです。実際には、16 ビットまたは 32 ビット バイトのマシンもあります。

あなたの編集に関して: ビットフィールドint a: n;のサイズは定義上nビットだと思います。構造体に配置された場合の余分なパディング ビットは、ビット フィールドではなく、構造体に属します。

私のアドバイス: ビットフィールドを使用しないunsigned charで、ビットマスク (の配列) を使用して作業してください。そうすれば、多くの動作 (オーバーフロー、パディングなし) が明確に定義されます。

于 2010-07-23T15:57:23.607 に答える
5

sizeof() を使用してビットフィールドのサイズを見つけることはできません。C99 を参照してください。

  • 6.5.3.4 The sizeof operator、ビットフィールドは明らかに sizeof() でサポートされていません
  • 6.7.2.1 Structure and union specifiersここでは、ビットフィールドが自立メンバーではないことが明確になっています。

それ以外の場合は、ビット フィールド メンバーに -1u (すべてのビットが設定された値) を割り当ててから、最上位ビットのインデックスを見つけることができます。例 (未テスト):

s.bitfield = -1u;
num_bits = ffs(s.bitfield+1)-1;

man ffs多くのための。

于 2010-07-23T16:27:51.873 に答える