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 存储在分配的内存中时。当您尝试打印时,testout.xprintf 将在联合内存中检索 4 个字节(假设 4 个字节 int)的数据并将其打印为整数。你可以在这里阅读工会

于 2012-10-31T06:31:57.600 回答
0

在 Little Endian 机器(x86、x64 等)上,答案是-32768.

这里是小端的答案的原因,从中你应该可以找出大端的原因。

Aunion将其所有成员存储在同一内存位置,其大小由其最大成员大小决定。假设sizeof(int)为 4 个字节,sizeof(float)为 4 个字节,这意味着testout成员存储在 4 个字节的位置。现在由于我们有 Little Endian 架构,内存中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,is 的 LSBx0x00的值0x123456,MSB 是0x80下一个更高地址的值0x123457,这给了我们一个 2 字节的表示形式0x8000,等于十进制-32768

于 2012-10-31T10:30:58.153 回答