我正在尝试使用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
,我不确定这意味着什么。这会影响为这个特定变量分配的字节数吗?
答案 0 :(得分:41)
此构造指定每个字段的位长度。
这样做的好处是,如果您小心,可以控制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)
我不确定我是否正确记得,但我认为我做对了。
答案 1 :(得分:19)
宣布bit field;冒号后面的数字以位为单位给出字段的长度(即,用多少位代表它)。
答案 2 :(得分:6)
unsigned op_type:9;
表示op_type是一个9位的整数变量。
答案 3 :(得分:4)
整数类型的冒号修饰符指定int应占用的位数。