我有以下自学代码:
#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(包含),field2
和k
可以是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/