我正在为考试而学习,我正在努力解决一些实践问题。我已经做了一段时间了..但是想不出来。请查看代码片段:
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.x
,x
的值和MSB是0x00
,下一个更高地址的值,这给了我们一个2字节的表示形式0x123456
,等于decimal0x80
。关于c - C struct打印,解码此代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13152353/