Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 位场操作_C++_Bit Fields - Fatal编程技术网

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:的确,我是我不是那样画的!