无法理解 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
我知道 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