web-dev-qa-db-ja.com

構造体または共用体の「unsigned temp:3」はどういう意味ですか?

可能性のある複製:
このC++コードはどういう意味ですか?

JNAを使用してC構造体をJavaにマップしようとしています。見たことのないものに出くわしました。

structの定義は次のとおりです。

struct op 
{
    unsigned op_type:9;  //---> what does this mean? 
    unsigned op_opt:1; 
    unsigned op_latefree:1; 
    unsigned op_latefreed:1; 
    unsigned op_attached:1; 
    unsigned op_spare:3; 
    U8 op_flags; 
    U8 op_private;
};

unsigned op_attached:1のように定義されている変数がいくつかありますが、それが何を意味するのかわかりません。これは、この特定の変数に割り当てられるバイト数に影響しますか?

57
Munir Ahmed

この構成では、各フィールドの長さをビット単位で指定します。

これの利点は、注意してsizeof(op)を制御できることです。構造体のサイズは、内部のフィールドのサイズの合計になります。

あなたの場合、opのサイズは32ビットです(つまり、sizeof(op)は4です)。

サイズは常に、署名されていないxxx:yyのグループごとに、次の8の倍数に切り上げられます。構築します。

つまり:

struct A
{
    unsigned a: 4;    //  4 bits
    unsigned b: 4;    // +4 bits, same group, (4+4 is rounded to 8 bits)
    unsigned char c;  // +8 bits
};
//                    sizeof(A) = 2 (16 bits)

struct B
{
    unsigned a: 4;    //  4 bits
    unsigned b: 1;    // +1 bit, same group, (4+1 is rounded to 8 bits)
    unsigned char c;  // +8 bits
    unsigned d: 7;    // + 7 bits
};
//                    sizeof(B) = 3 (4+1 rounded to 8 + 8 + 7 = 23, rounded to 24)

これを正しく覚えているかどうかはわかりませんが、私は正しく理解したと思います。

42
utnapistim

ビットフィールド を宣言します。コロンの後の数は、フィールドの長さをビット単位で示します(つまり、フィールドを表すために使用されるビット数)。

19
James McNellis
unsigned op_type:9;

つまり、op_typeは9ビットの整変数です。

6
goedson

整数型のコロン修飾子は、intが占めるビット数を指定します。

4
plinth