因为我想为 ASCII 艺术找个借口……
声明union
允许您选择如何解释其数据。在您的情况下,作为 aunsigned short
或 a char [2]
。这两个都是 2 字节长,因此您的联合将引用 2 字节的内存部分,因此:
union a e;
---------------
e-> | ???? | ???? |
---------------
现在您决定将联合解释为字符数组:
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 所述),这意味着最低有效字节首先存储在内存中。这意味着当您的代码查看 a 时unsigned short
,它认为0x03
是最不重要的字节。
所以你的 2-byte unsigned short 被解释为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