我有以下自学代码:

#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;
}

我知道unsigned int k:4的意思是k为4位宽,或者最大值为15,结果如下。
2
0
1

比如filed1可以是0~7(包含),field2k可以是0~15,为什么会这样呢?也许它应该全部为零?

最佳答案

你正在溢出你的领域。我们以 k 为例,它是 4 位宽。正如你所说,它可以保存从 0 到 15 的值,以二进制表示,这是

0  -> 0000
1  -> 0001
2  -> 0010
3  -> 0011
...
14 -> 1110
15 -> 1111

因此,当您分配 18 时,具有二进制表示
18 -> 1 0010 (space added between 4th and 5th bit for clarity)
k 只能保存低四位,所以
k = 0010 = 2.

等价物也适用于您的其余字段。

关于c++ - C++ 中的位域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3429802/

10-11 23:22