我正在为考试而学习,我正在努力解决一些实践问题。我已经做了一段时间了..但是想不出来。请查看代码片段:

 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),会打印出什么?我知道我们应该期待数字…但我不知道他们从哪里得到数字…没有输出。
任何解释都将不胜感激。谢谢!

最佳答案

在一些Endian机器(x86、x64等)上,答案是-32768
下面是小Endian的答案,您应该能够从中找出大Endian的原因。
Accc>将所有成员存储在同一内存位置,其大小由其最大大小的成员决定。假设union为4字节,sizeof(int)为4字节,这意味着sizeof(float)成员存储在4字节的位置。现在由于我们很少使用Endian架构,所以语句testout存储在内存中,如下所示:
最低有效字节(LSB)testout.i = 0xC0208000存储在最低字节地址,假设该地址为i
0x00存储在下一个更高的地址,即0x123456,而0x80存储在0x123457地址。
最高有效字节(MSB)0x20存储在0x123458中。
像这样的视觉效果

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

这里的关键点是0xC0的所有成员都从同一个字节地址开始存储。因此,当您访问0x123459时,union的LSB是testout.xx的值和MSB是0x00,下一个更高地址的值,这给了我们一个2字节的表示形式0x123456,等于decimal0x80

关于c - C struct打印,解码此代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13152353/

10-09 23:01