1结构体中的位字段
struct torgle_register
{
unsigned int SN :4 //SN 占用4个bit
unsigned int :4 // 4bit没有占用
bool goodIn :1 //goodIn占用1个bit
bool goodTorgle :1 //goodTorgle占用1个字节
}
使用sizeof(torgle_register)的值是4,是因为这个结构体是四个字节对齐的,如果将结构体改成下边这样,则占用8个字节
struct torgle_register
{
unsigned int SN :16 //SN 占用16个bit
unsigned int :16 // 16bit没有占用
bool goodIn :1 //goodIn占用1个bit
bool goodTorgle :1 //goodTorgle占用1个字节
}
2.共用体
结构体可以同时存储int long double,共用体的长度是其内部类型最长的类型的长度
union one4all
{
int int_val;
double d_val;
double double_val;
};
int main()
{
one4all one;
one.int_val=15;
one.d_val=20.0;
one.double_val=25.0;
cout<<"sizeof(one4all):"<<sizeof(one4all)<<endl;
cout<<"int_val:"<<*(double *)(&one.int_val)<<" d_val:"<<one.d_val<<" double_val:"<<one.double_val<<endl;
}
输出结果:8 25 25 25
共用体使用场景:
假设管理一个小商品目录,其中有一些商品的ID为整数,另一些的ID为字符串,此时可以这样做:
struct widget
{
char brand[20];
int type;
union id
{
long id_num;
char id_char[20];
}
}
3.枚举
enum spectrum{red,orange,yellow,green,bule}/*让spectrum成为新类型的名称,spectrum被称为枚举
red yellow等称为符号常量,分别为0,1,2...,这些称为枚举量
在不进行强制类型转换的情况下,只能将定义枚举时候使用的枚举量赋值给这种枚举变量,如下:
spectrum band;
band=red //t正确,定义了赋值运算
++band //f错误,没有定义算数运算
band=1000 // 错误,超过定义时候的值
枚举量是整形,可以被提升到int类型,但是int类型不能自动转换成枚举类型
int color=red; //枚举可以自动转换成int
red=3; //int 不能自动转换成枚举
color=red+4; //red自动转换成了int
如果int的值是有效的,也可以通过强制转换将其赋值给枚举变量:
red=spectrum(2);//将2赋值给red
red=spectrum(1000); //超过枚举初始的范围,错误
设置枚举量的值
enum bits{one=1,two=2,four=4,eight=8};
enum bits{first=1,second=100,third}; //可以只赋值一部分,其中first=0,third=101
枚举的取值范围:
首先找到上限,需要知道枚举量的最大值。2的(向上取整(log2(最大值)))次方得到的数值减1便是枚举凉的上限。比如,枚举的最大值是101,则其上线是128-1=127.
枚举值的下限:如果枚举值的最小值大于0,则其下限是0,当最小值小于0时候,采用和计算上限相同的方式。例如最小值是-6,则其下显示-8+1=-7