#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//////位段、枚举、联合
//位段
//位段的声明和结构类似,有两个不同:
//1.位段的成员必须是int、unsigned int、signed int或char。
//2.位段的成员名后边有一个冒号和一个数字。
//如下
//struct S
//{
// int a : 2;
// int b : 5;
// int c : 10;
//};
//
//位段的内存分配
//1.位段的成员可以是int unsigned int signed int 或者是char(属于整形家族)类型。
//2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
//3.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
//
//位段--二进制位
//struct S
//{
// int a : 2;
// int b : 5;
// int c : 10;
// int d : 30;
//};
////2+5+10+30=47bit -- 6个字节*8=48bit
//int main()
//{
// struct S s;
// printf("%d\n", sizeof(s));//8个字节
// return 0;
//}
//位段的跨平台问题
// 1.int位段被当成有符号数还是无符号数是不确定的。
// 2.位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,如写27,在16位机器会出问题)
// 3.位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
// 4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。
//总结:
// 跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
//枚举
//枚举顾名思义就是一一列举。
//把可能的取值一一列举。
//比如我们现实生活中的星期、月份等。
//
//枚举类型的定义
//enum Day
//{
// //枚举的可能取值-常量
// Mon,
// Tues,
// Wed,
// Thur,
// Fri,
// Sat,
// Sun
//};
//enum Sex
//{
// Male=4,
// Female=7,
// Secret=8
//};
//enum Color
//{
// Red=1,
// Green=3,
// Blue=5
//};
//int main()
//{
// enum Sex s = Male;
// enum Color c = Blue;
// printf("%d %d %d %d %d %d %d\n", Mon, Tues, Wed, Thur, Fri, Sat, Sun);
// printf("%d %d %d\n", Red, Green, Blue);
// printf("%d %d %d\n", Male, Female, Secret);
// printf("%d\n", s);
// printf("%d\n", c);
// return 0;
//}
//
//枚举的优点
//1.增加代码的可读性和可维护性。
//2.和#define定义的标识符比较,枚举有类型检查,更加严谨。
//3.防止了命名污染(封装)
//4.便于调试
//5.使用方便,一次可以定义多个常量
//联合
//联合也是一种特殊的自定义类型,这种类型定义的变量也包含了一系列的成员,特征是这些成员
//公用同一块空间(所以联合也叫共用体)
//
//联合类型的定义
//union Un
//{
// char c;
// int i;
//};
//int main()
//{
// union Un u;
// printf("%d\n", sizeof(u));
// printf("%p\n", &u);
// printf("%p\n", &(u.c));
// printf("%p\n", &(u.i));
// return 0;
//}
//
//联合的特点
// 联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小
// (因为联合至少得有能力保存最大的那个成员)。
//
//union un
//{
// int a; //4
// char arr[5]; // 1/5
// //最大对齐数为4
//};
//int main()
//{
// union un u;
// printf("%d\n", sizeof(u));//8
// return 0;
//}
//
//联合大小的计算
// 联合的大小至少是最大成员的大小。
// 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
//联合实例
int check_sys()
{
//int a = 1;
//return*(char*)&a;
//返回1,表示小端
//返回2,表示大端
union
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
//int a = 1;
int ret = check_sys();
if (1 == ret)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}