1

私はこのような構造を持っています

typedef struct mystruct{
    char* name;
    int age : 5;
}instr;

int main(){
    instr object1={.name= "tiny",.age=20};
    printf("%d and %d\n",object1.age);
    return 0;
}

構造定義の行
int age : 5の意味は何ですか?

ここでは5ではなく、より低い値の場合、コンパイル警告が表示されます

暗黙的な定数変換でのオーバーフロー [-Woverflow]

4

1 に答える 1

1

符号付き 5 ビット整数 (int age : 5;ビットフィールドで定義) は -16 .. +15 の範囲の値を保持できますが、20 はこの範囲外です。

unsigned int6 ビット以上を使用または使用してください。実際、年齢によっては、符号なし 7 ビットまたは符号付き 8 ビットが必要になる場合があります。

ビットフィールドは、言語の興味深い部分です。ここのように年齢に合わせて使用​​するメリットがあるかどうかは疑問です. char何らかの値を使用することもできますが、使用しても構造内のスペースが無駄になることはありませんint(32 ビット マシンでは 8 バイト、64 ビット マシンではおそらく 16 バイトのサイズになります)。 .

ISO/IEC 9899:2011 の §6.7.2.1 Struct and union specifiersの脚注 125 には、次のように記載されています。

125)上記の 6.7.2 で指定されているように、使用される実際の型指定子がintまたは として定義された typedef-nameintである場合、ビットフィールドが符号付きか符号なしかは実装定義です。

intコンパイラのプレーン ビット フィールドが署名されているという警告メッセージが表示されます。signed intタイプを にするかにするかを明示する必要がありますunsigned int

于 2013-07-07T02:56:53.750 に答える