联合类型声明:union + 名称 ----- 联合体的变量定义
union Un
{
char c;
int i;
};
union Un u; //定义变量u
联合体的特征:联合体的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
例题:判断目前计算机的大小端存储。
什么是大小端存储?
大端(存储)模式,是指高字节存放在低位;低字节存放在高位。
小端(存储)模式,高字节存放高位;低字节存放低位。
简单记忆:大端存储模式下,字节顺序和在地址中的顺序是一致的;而小端存储模式下,刚好相反。
0x0011存储时,大端模式下,地址中的顺序为00 11 ;在小端存储模式下,地址中的顺序为 11 00。
#include <stdio.h>
int check_sys()
{
int i = 1;
return *(char*)&i;
}
int main()
{
int ret = check_sys();
if (ret == 0)
{
printf("大端\n");
}
else
printf("小端\n");
return 0;
}
//打印小端
使用共用体来判断大小端。
#include <stdio.h>
int check_sys()
{
int i = 1;
union un //共用体的定义和结构体的定义类似
{
char j;
int q;
}u;
u.q = i; //将i的值存入共用体的空间中
return u.j; //访问一个字节数据
}
int main()
{
int ans = check_sys();
if (ans == 0)
{
printf("大端\n");
}
else
printf("小端\n");
return 0;
}
//打印小端。
共用体的大小计算
方法:
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。(最大对齐数与编译器无关,只和数据类型有关)
例:
#include <stdio.h>
int main()
{
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
//打印8 16