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
...明らかに、浮動小数点の部分的なサイズなどを返すことはできません。しかし、それは興味深い質問を提起しました。 Is Cには、変数/型のビット数を示す同等のものがありますか?理想的には、charやintのような通常の型でも機能します。 -)、ビットフィールドに加えて。
更新:
ビットフィールドにsizeof()に相当する言語がない場合、実行時にそれを計算する最も効率的な方法は何ですか?これに依存するループがあり、ビットフィールドのサイズを変更してもループが壊れたくないと想像してください。公平な不正行為がなく、ビットフィールドのサイズとループの長さがマクロになっています。 ;-)
Cのビットフィールドのサイズを決定することはできません。ただし、limits.hにあるCHAR_BIT
の値を使用して、他のタイプのビットのサイズを確認することはできます。ビット単位のサイズは、単にCHAR_BIT
* sizeof(タイプ)です。
Cバイトがオクテットであると想定しないでください。少なくとも 8ビットです。 16ビットバイトまたは32ビットバイトの実際のマシンがあります。
編集に関して:ビットフィールドint a: n;
のサイズはn定義上ビットです。構造体に配置されたときの余分なパディングビットは、ビットフィールドではなく構造体に属します。
私のアドバイス:ビットフィールドは使用せず、unsigned char
(の配列)を使用してビットマスクを操作します。このようにして、多くの動作(オーバーフロー、パディングなし)が明確に定義されます。
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
詳細については。