C++中的Bitfields

dat*_*ili 4 c++ bit-fields

我有以下自学习代码:

#include <iostream>
using namespace std;
struct bitfields{
    unsigned field1: 3;
    unsigned field2: 4;
    unsigned int k:  4;
};

int main(){
    bitfields field;
    field.field1=8;
    field.field2=1e7;
    field.k=18;
    cout<<field.k<<endl;
    cout<<field.field1<<endl;
    cout<<field.field2<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道这unsigned int k:4意味着k是4位宽,或最大值15,结果如下.

2
0
1
Run Code Online (Sandbox Code Playgroud)

例如,filed1可以是从0到7(含),field2并且k从0到15为什么这样的结果?也许它应该全部为零?

fal*_*tro 9

你满是田野.我们k举一个例子,它是4位宽.正如你所说,它可以保存0到15之间的值,这是二进制表示

0  -> 0000
1  -> 0001
2  -> 0010
3  -> 0011
...
14 -> 1110
15 -> 1111
Run Code Online (Sandbox Code Playgroud)

所以当你指定18时,有二进制表示

18 -> 1 0010 (space added between 4th and 5th bit for clarity)
Run Code Online (Sandbox Code Playgroud)

k 只能保持低四位,所以

k = 0010 = 2.
Run Code Online (Sandbox Code Playgroud)

等效也适用于其他字段.