1

我的代码如下: -

#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是怎么来的?

4

3 回答 3

4

因为我想为 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 个字节长来存储最大的数据类型。 5120x00000200十六进制的。所以存储那个整数小端,你有:

    -----------------------------
e-> | 0x00 | 0x02 | 0x00 | 0x00 |
    -----------------------------

e.x512也是如此。e.y[0]是0和e.y[1]2

于 2012-06-07T18:57:09.953 回答
3

515 是十六进制 0x0203。

ey[0] 为 3,或 0x03。ey[1] 为 2,或 0x02。

short int x 将两者组合成 0x0203 或 515。

于 2012-06-07T18:24:46.903 回答
1

你有一个小端系统:

2 * 2 8 + 3 = 515。

联合有效地允许您将 s 使用的内存重新解释short为一对连续char的 s。

于 2012-06-07T18:24:17.907 回答