[英]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(包括), 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.
等效也適用於其他字段。
您有這些結果,因為分配溢出每個位域。
變量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.