#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//联合体/共用体--------共用一块空间,空间至少是最大成员的大小
//联合体是一种特殊的自定义类型,这种类型定义的变量包含一系列的成员,特征是这些成员共用一块空间
//union un//创建联合体类型
//{
// char c;//1
// int i;//4
//};
//int main()
//{
// union un u={10};//同一时间,联合体成员只能改其中的一个值
// u.i = 1000;//u.i和u.c只能有一个有效,因为共用一个空间
// u.c = 100;
// printf("%d\n", sizeof(u));//4
// printf("%p\n", &u);//000000176572F8F4
// printf("%p\n", &(u.c));//000000176572F8F4
// printf("%p\n", &(u.i));//000000176572F8F4
// return 0;
//}
//判断当前计算机的大小端
//int check_sys()和check_sys2()是两种实现方法
//法一:
int check_sys()//使用函数,并不进行打印,用返回值确定是大端还是小端,使之更加灵活
{
int a = 0x11223344;//a是int型,4个字节,,0x11223344是十六进制,也是4个字节
//44是低位,11是高位, 在内存中,如果由低地址到高地址为11223344,则低位放在高地址,是大端存储
// 如果由低地址到高地址为44332211,则低位放在低地址,是小端存储
if ((*(char*)&a) = 4)//&a拿出地址,(char*)强制类型转换为char,*解引用.目的是拿出前两个字节
{
return 1;//小端
}
else
{
return 0;//大端
}
}
//法二:
int check_sys2()
{
union U
{
char c;
int i;
}u;//在联合体里面创建个变量u
u.i = 1;
return u.c;//目的:在联合体 c i共用一个空间,而char正好是int的前四分之一部分,所以可以判断
}
int main()
{
int ret=check_sys();//写函数的目的是让其更加独立!
if (ret == 1)
printf("小端\n");//小端---对照check_sys()
else
printf("大端\n");
int check_sys2();
if (ret == 1)
printf("小端\n");//小端----对照check_sys2();
else
printf("大端\n");
return 0;
}
//使用场景举例:学校里有老师和同学,老师同学都有性别,身高,爱好,职务等,
//那么如何区分老师学生呢,此时用联合体,并把联合体放在第一个,其他放后,就能区分
//联合体大小的计算
//空间至少是最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候,
//就要对齐到最大对齐数的整数倍
union Un
{
char a[5];//1----5
int i;//4----必须是最大对齐数4的倍数,且大于5,就是8
};
union Vn
{
short a[5];//2----10
int i;//4----必须是最大对齐数4的倍数,且大于10,就是12
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));//8
union Vn v;
printf("%d\n", sizeof(v));//12
return 0;
}