1

私はテストのために勉強している途中で、いくつかの練習問題を解決しようとしています。私はこれにしばらく取り組んできましたが、理解できません。コードフラグメントを見てください:

 union {
   int i;
   short x;
   unsigned short u;
   float f;
 } testout;
 testout.i=0xC0208000;

質問する前に、誰かが上記のコードがどのように機能するかを説明してもらえますか?私の推測ではtestout.i=0xC0208000、int、short、unsigned short、またはfloatのいずれかを配置し、結果をそのアドレスに配置します。(?)

問題は、私たちが書くと何が印刷されるかということprintf("%d", testout.x)です。数字を期待する必要があることはわかっていますが、どこから数字を取得しているのかわかりません。出力がありません。

説明をいただければ幸いです。ありがとう!

4

2 に答える 2

3

ユニオンを定義すると、メモリはユニオン内の最大の型に割り当てられます。あなたの場合はですfloat。あなたが言うときtestout.i=0xC0208000;0xC0208000は割り当てられたメモリに保存されます。また、printfを印刷しようとするtestout.xと、ユニオンメモリ内の4バイト(4バイトのintを想定)のデータが取得され、整数として出力されます。あなたはここで組合について読むことができます

于 2012-10-31T06:31:57.600 に答える
0

リトルエンディアンのマシン(x86、x64など)では、答えはです-32768

これがリトルエンディアンの答えの理由です。そこからビッグエンディアンの理由を理解できるはずです。

Aunionは、すべてのメンバーを同じメモリ位置に格納します。そのサイズは、最大サイズのメンバーによって決まります。sizeof(int)4バイトおよび4バイトであると仮定するとsizeof(float)、これはtestoutメンバーが4バイトの場所に格納されることを意味します。リトルエンディアンアーキテクチャがあるため、ステートメントは次のようにメモリにtestout.i = 0xC0208000保存さiれます。

  • 最下位バイト(LSB)0x00は最下位バイトアドレスに格納されます。このアドレスをと仮定します0x123456
  • 0x80次に高いアドレス、つまり0x123457、に0x20格納され、アドレスに格納されます0x123458
  • 最上位バイト(MSB)0xC0はに格納され0x123459ます。

視覚的にこのようなもの

Addresses       ->  0x123459    0x123458    0x123457    0x123456
Binary Values   ->  11000000    00100000    10000000    00000000
Hex Values      ->  0xC0        0x20        0x80        0x00

ここで重要な点は、のすべてのメンバーがunion同じバイトアドレスから開始して格納されることです。したがって、にアクセスするtestout.xと、のLSBx0x00、の値であり0x123456、MSBは0x80、次に高いアドレスの値であり、10進数に等しい0x1234572バイトの表現を提供します。0x8000-32768

于 2012-10-31T10:30:58.153 に答える