无法理解C中联合程序的输出

时间:2015-01-16 13:03:54

标签: c unions

我知道C中union的基本属性,但仍然无法理解输出,有人可以解释一下吗?

#include <stdio.h>

int main()
{
        union uni_t{
                int i;
                char ch[2];
        };
        union uni_t z ={512};
        printf("%d%d",z.ch[0],z.ch[1]);
        return 0;
}

运行此程序时的输出是

02

3 个答案:

答案 0 :(得分:2)

union a
{
    int i;
    char ch[2];
}

这声明了一个类型union a,其内容(即此类变量的内存区域)可以作为 整数(a.i)访问 2元素字符数组(a.ch)。

union a z ={512};

这定义了z类型的变量union a,并将其第一个成员(恰好是类型为a.i的{​​{1}})初始化为int的值}。 (Cantfindname有二进制表示。)

512

这将获取第一个字符,然后是printf( "%d%d", z.ch[0], z.ch[1] ); 中的第二个字符,并打印其数值。同样,Cantfindname谈论了endianess以及它如何影响结果。基本上,你要逐字节地分开a.ch

整个shebang显然是假设那个int,对于台式电脑而言......已经很久了,所以你可能想看看在一个更新的教程。 ; - )

答案 1 :(得分:1)

你得到的是结束(http://en.wikipedia.org/wiki/Endianness)的结果。

512是二进制的0b0000 0010 0000 0000,小端以0000 0000 0000 0010存储在存储器中。然后ch [0]读取最后8位(0b0000 0010 = 2十进制)和ch [1]读取前8位(0b0000 0000 =十进制0)。

答案 2 :(得分:0)

使用int不会导致32位机器中的此输出,因为sizeof(int)= 4.仅当我们使用16位系统或使用 short int 时才会出现此输出内存大小为2个字节。

Union是一个变量,可以保存(在不同的时间)不同类型和大小的对象,编译器可以跟踪大小和对齐要求。

union uni_t
{
      short int i;
      char ch[2];
};

此代码段声明一个具有两个成员的联合 - 一个整数和一个字符数组。 通过简单地分配值,联合可用于在不同时间保存不同的值。

union uni_t z ={512};

这定义了一个类型为union uni_t的变量z,并将整数成员(i)初始化为值512.

因此存储在z中的值变为:0b0000 0010 0000 0000

当使用字符数组引用此值时,ch [1]引用数据的第一个字节,ch [0]引用第二个字节。

ch [1] = 0b00000010 = 2 ch [0] = ob00000000 = 0

因此printf("%d%d",z.ch[0],z.ch[1])会导致

  

02