簡體   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