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

この特定の結果はプラットフォーム固有です。endiannessについて読む必要があります。

しかし、あなたの質問に答えるには、いいえ、メモリを共有しない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 が設定さiれ、2 6 = 64 になります。

于 2013-01-13T20:37:33.190 に答える
1

これはプラットフォームと特定のコンパイラの両方に依存しますが、これはあなたの場合に起こることです:

共用体は、int と struct の両方を同じメモリにオーバーレイします。ここでは、int のサイズが 32 ビットであると仮定します。繰り返しますが、これは複数の要因に依存します。メモリ レイアウトは次のようになります。

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
                  SSSSSSSSFFFFFF

Iは整数、Sは 2 番目のフィールド、Fは構造体の最初のフィールドを表します左側に最上位ビットを示していることに注意してください。

整数をゼロに初期化すると、すべてのビットがゼロに設定されるため、1 番目と 2 番目もゼロになります。word.first を 2 に設定すると、メモリ レイアウトは次のようになります。

0000000000000000000000000000010
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
                  SSSSSSSSFFFFFF

これにより、整数の値は 2 になります。ただし、word.second の値を 2 に設定すると、メモリ レイアウトは次のようになります。

00000000000000000000000001000000
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
                  SSSSSSSSFFFFFF

これにより、整数の値が 64 になります。

于 2013-01-13T20:47:58.593 に答える