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

63

可能是重复问题:
这段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,我不确定这意味着什么。这会影响为此特定变量分配的字节数吗?


1
哇,这对我来说也是全新的。不错的发现! - Xavier Ho
5
添加“冒号”以帮助它在搜索中被找到。 - Pete Kirkham
使用位域最好的做法是尽量避免使用它们。最好使用掩码和移位来以明确定义的方式访问整数中的一组位。 - starblue
4个回答

47

这个结构指定了每个字段的位长度。

这样做的好处是,如果你小心谨慎,可以控制sizeof(op)。结构体的大小将是其内部字段大小之和。

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

对于每组unsigned 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)

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


12
记住孩子们!位域是编译器相关的,没有C/C++标准规定a:4上的前4位必须被使用。 - Gregor Brandt
1
假设每个字节有8位是安全的。然而,假设编译器不使用填充位或具有一个特定的字节顺序是不安全的。 - starturtle
C和C++并没有将字节定义为8位。 - user904963
它不是8的倍数,而是一个单词的倍数,这个单词与机器有关,比如8、16或32位。 - Jamishon

20

它声明了一个位域(bit field);冒号后面的数字表示该字段占用的位数(即使用多少位来表示它)。


6
unsigned op_type:9;

意思是op_type是一个9位整数变量。


4

在整数类型上使用冒号修饰符可以指定int应该占用多少位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接