与联合概念相关的c代码输出问题

时间:2012-06-07 18:22:31

标签: c unions

我的代码如下: -

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

3 个答案:

答案 0 :(得分:4)

因为我想要一个ASCII艺术借口...

声明union可让您选择如何解释其数据。在您的情况下,可以是unsigned shortchar [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字节无符号短整数被解释为0x02030x0203十六进制是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.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)

您有一个little-endian系统:

2 * 2 8 + 3 = 515。

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