繁体   English   中英

C ++中的Bitfields

[英]Bitfields in C++

我有以下自学习代码:

#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.

等效也适用于其他字段。

您有这些结果,因为分配溢出每个位域。

变量filed1是3位,但是8需要4位才能呈现(1000)。 低三位全为零,因此filed1为零。

对于filed2由10001表示,但filed2仅为4位。 低四位表示值1。

最后,对于k ,18由10010表示,但k仅为4位。 低四位表示值2。

我希望这有助于澄清事情。

在C ++中,当你达到它的上限时,任何无符号类型都会回绕[1]。 当您定义4位的位域时,您存储的每个值也会被包裹。 大小为4的位域的可能值为0-15。 如果你存储'17',那么你换成'1',对于'18'你再加一个'2'。

在数学上,包装值是模目标类型的可能值的的原始值:

对于大小为4的位域(2 ** 4个可能的值):

18 % 16 == 2
17 % 16 == 1

对于大小为3的位域(2 ** 3个可能的值):

8 % 8 == 0.

[1]对于已签名的类型,情况并非如此,因为未定义会发生什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM