枚举类型是可以赋予初值的,即使不赋予,系统默认也会赋予初值,从0开始自增1。
枚举类型的大小是系统定义的,一般为一个整型。
枚举是创建一种类型,一种枚举类型,define只是定义的标识符,系统计算的时候还是按照赋予的值来进行运算的。结构体创建的也是一种类型。
enum Color
{
RED,
YELLOW,
BULE
};
enum Sex
{
MALE = 2,
FEMALE = 3,
SECRET = 5
};
int main()
{
enum Sex s = MALE;
s = FEMALE;
printf("%d %d %d\n", RED, YELLOW, BULE);
printf("%d %d %d\n", MALE, FEMALE, SECRET);
return 0;
}
联合体也叫共用体,一种特殊的自定义类型。从下图中可以看出,两个变量共用一个地址,在使用时只能同时使用其中一个变量。
通过联合体来判断电脑系统大小端存储的问题
下图为大小端存储示意图
int check_sys()
{
int a = 1;
return *(char*)&a;
//返回1表示小端
//返回0表示大端
}
int check_sys2()
{
union U
{
char c;
int i;
}u;
u.i = 1;
return u.c;
//返回1表示小端
//返回0表示大端
}
int main()
{
int ret = check_sys();
if (1 == ret)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
函数check_sys使用强制转换地址类型,提取第一个字节的存储的内容来判断大小端问题,check_sys2则使用联合体的方式,来取出同一个地址下的第一个字节的内容来判断系统的大小端。
联合体大小的计算,计算对齐数,vs编译器默认对齐数为8
结构体大小的计算,需要通过对齐数计算
位断操作为了节省空间,没有对齐数
枚举每一个变量的大小为一个整型
联合体需要通过对齐数计算得到