我知道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
答案 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