我的代码如下: -
#include<stdio.h>
main() {
union a {
short int x;
char y[2];
};
union a e;
e.y[0] = 3;
e.y[1] = 2;
printf("%d\n%d\n%d\n", e.y[0], e.y[1], e.x);
return 0;
}
它输出为
3
2
515
我不明白这515是怎么来的?
答案 0 :(得分:4)
因为我想要一个ASCII艺术借口...
声明union
可让您选择如何解释其数据。在您的情况下,可以是unsigned short
或char [2]
。这两个都是2个字节长,所以你的联合将引用一个2字节的内存部分,因此:
union a e;
---------------
e-> | ???? | ???? |
---------------
现在您决定将您的union解释为字符数组:
e.y[0] = 3;
---------------
e-> | 0x03 | ???? |
---------------
e.y[1] = 2;
---------------
e-> | 0x03 | 0x02 |
---------------
然后您将其解释为unsigned short
:
printf("%d\n%d\n%d\n", e.y[0], e.y[1], e.x);
你是一个小端系统(正如@Oli所说),这意味着最低有效字节首先存储在内存中。这意味着当您的代码查看unsigned short
时,它认为0x03
是最不重要的字节。
因此,您的2字节无符号短整数被解释为0x0203
。 0x0203
十六进制是515
十进制。
<小时/> 我认为,这个评论非常有趣,可以在答案中加以澄清。
假设我们这样做:
union a {
int x;
char y[2];
};
int main(int argc, char * argv[])
{
union a e = {512};
}
里面有什么?分解:
int
是4个字节,char [2]
是2个字节,因此union
长4个字节来存储最大的数据类型。十六进制512
为0x00000200
。所以存储整数小端,你有:
-----------------------------
e-> | 0x00 | 0x02 | 0x00 | 0x00 |
-----------------------------
因此e.x
为512. e.y[0]
为0且e.y[1]
为2
答案 1 :(得分:3)
515是十六进制0x0203。
e.y [0]为3或0x03。 e.y [1]是2,或0x02。
short int x将两者合并为0x0203或515。
答案 2 :(得分:1)