2

在下面的代码中

#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;
}

当我初始化 word.first = 2 时,正如预期的那样,它会更新单词的 5 位,并给出所需的输出。'i' 的输出有点令人困惑。当 word.first = 2 时,i 给出的输出为 2,当我执行 word.second = 2 时,i 的输出为 64。由于它们共享相同的内存块,后一种情况下的输出(对于 i)不应该是2?

4

2 回答 2

7

这个特定的结果是特定于平台的;你应该阅读字节序

但是要回答你的问题,不,word.first不要word.second共享记忆;它们占据不同的位。显然,您平台上的基本表示如下:

bit   15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
     +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
     |     |         second           |    first     |
     +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
     |<------------------- i ----------------------->|

所以设置word.second = 2设置位#6 of i, 和 2 6 = 64。

于 2013-01-13T20:37:33.190 回答
1

虽然这取决于您的平台和您的特定编译器,但在您的情况下会发生这种情况:

联合将 int 和 struct 覆盖到同一内存上。现在让我们假设您的 int 大小为 32 位。同样,这取决于多种因素。您的内存布局将如下所示:

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
                  SSSSSSSSFFFFFF

其中I代表整数,S代表第二个字段,F代表结构的第一个字段。请注意,我在左边代表了最重要的位。

当您将整数初始化为零时,所有位都设置为零,因此 first 和 second 也为零。当您将 word.first 设置为 2 时,内存布局变为:

000000000000000000000000000000010
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
                  SSSSSSSSFFFFFF

这导致整数的值为 2。但是,通过将 word.second 的值设置为 2,内存布局变为:

000000000000000000000000001000000
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
                  SSSSSSSSFFFFFF

这为您提供了 64 的整数值。

于 2013-01-13T20:47:58.593 回答