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

unable to understand the output of union program in C

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

#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

您在这里得到的是字节序 (http://en.wikipedia.org/wiki/Endianness) 的结果。

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

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

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

union a z ={512};

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

printf( "%d%d", z.ch[0], z.ch[1] );

这从 a.ch 中获取第一个字符,然后是第二个字符,并打印它们的数值。同样,Cantfindname 讨论字节序及其对结果的影响。基本上,您正在逐字节拆分 int

而且整个 shebang 显然 假设 sizeof( int ) == 2,这在桌面计算机上已经不正确了......很长一段时间了,所以你可能想要正在查看更新的教程。 ;-)

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

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

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