结构或联合中的'unsigned temp:3'是什么意思?

Mun*_*med 57 c c++ colon bit-fields

可能重复:
这个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;
};
Run Code Online (Sandbox Code Playgroud)

你可以看到一些变量被定义为unsigned op_attached:1,我不确定这意味着什么.这会影响为这个特定变量分配的字节数吗?

utn*_*tim 42

此构造指定每个字段的位长度.

这样做的好处是sizeof(op),如果你小心的话,你可以控制它.结构的大小将是内部字段大小的总和.

在您的情况下,op的大小是32位(即,sizeof(op)是4).

对于每组无符号xxx,大小总是向上舍入到8的下一个倍数:yy; 构造.

这意味着:

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)
Run Code Online (Sandbox Code Playgroud)

我不确定我是否正确记得,但我认为我做对了.

  • 记住小孩!位字段是编译器相关的,没有C/C++标准规定必须在上面的a:4上使用前4位. (12认同)

Jam*_*lis 19

它声明了一个字段 ; 冒号后面的数字以位为单位给出字段的长度(即,用多少位来表示它).


goe*_*son 6

unsigned op_type:9;
Run Code Online (Sandbox Code Playgroud)

意味着op_type是一个9位的整数变量.