C++ 位场操作
在下面的代码中C++ 位场操作,c++,bit-fields,C++,Bit Fields,在下面的代码中 #include <iostream> using namespace std; struct field { unsigned first : 5; unsigned second : 9; }; int main() { union { field word; int i; }; i = 0; cout<<"First is : "<<word.first<<"
#include <iostream>
using namespace std;
struct field
{
unsigned first : 5;
unsigned second : 9;
};
int main()
{
union
{
field word;
int i;
};
i = 0;
cout<<"First is : "<<word.first<<" Second is : "<<word.second<<" I is "<<i<<"\n";
word.first = 2;
cout<<"First is : "<<word.first<<" Second is : "<<word.second<<" I is "<<i<<"\n";
return 0;
}
#包括
使用名称空间std;
结构域
{
第一个未签名者:5;
未签名秒:9;
};
int main()
{
联盟
{
字段词;
int i;
};
i=0;
cout这个特定的结果是特定于平台的;您应该仔细阅读
但要回答您的问题,不,word。首先
和word。其次
不共享内存;它们占用单独的位。显然,您平台上的基本表示形式是:
bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| | second | first |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|<------------------- i ----------------------->|
位15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
||第二|第一|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
||
因此,设置word.second=2
将设置i
的第6位,以及26=64。虽然这取决于您的平台和特定的编译器,但在您的情况下会发生以下情况:
并集将int和struct都覆盖在同一内存上。现在,让我们假设int的大小为32位。同样,这取决于多个因素。内存布局如下所示:
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSSSSFFFFF
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSFFF
其中,I表示整数,S表示结构的第二个字段,F表示结构的第一个字段。请注意,我在左侧表示了最高有效位
当您将整数初始化为零时,所有位都设置为零,因此第一位和第二位也是零。
将word.first设置为2时,内存布局将变为:
00000000000000000000000000000010
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSSSSFFFFF
00000000000000000000000001000000
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSSSSFFFFF
00000000000000000000000000000010
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSFFF
这将导致整数的值为2。但是,通过将word.second的值设置为2,内存布局将变为:
00000000000000000000000000000010
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSSSSFFFFF
00000000000000000000000001000000
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSSSSFFFFF
00000000000000000000000001000000
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SSSSSSFFF
这给了你一个64的整数。我的意思是word和“I”共享内存块是的,但是word。第一个和word。第二个在word中使用不同的位。@oli我一直在寻找的解释。非常感谢!只有第一个不会持续到第5位,它会持续到第4位。你能改变它吗?@UnderDog:的确,我是我不是那样画的!