- 位段:成员必须是int 、unsigned int 和signed int .
位段的成员名后边有一个冒号和一个数字。 - 计算:位段是按比特位的大小来进行计算的,比如一个字节有8个比特位,存入的时候根据数据类型的不同计算出相应的比特位依次往后存储,若存储不下则开辟下一个字节
eg:
struct s
{
int _a:4;
int _b:5;
int _b:6;
int _b:30;
};
s就是一个位段类型
printf("%d\n",sizeof(struct S));//8
分析:int 型具有四个字节,共32个比特位,故存储时将前三个放入第一块空间中,由于第四个是30个比特位存储不下,因此开辟下一快空间存储,即开辟了两快空间,就是好8个字节。其他类型同理可得。
和结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
跨平台问题:
1)int 位段被当成有符号数还是无符号数是不确定的;
2)位段中最大的数目不能确定。(16位机器最大16,32位机器最大32)
3)当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余的位时,是舍弃剩余的位还是利用,不确定。
枚举:一 一列举
eg:
enum game
{
Start=2;
Play;//3
End//4
};
枚举常量默认值从0开始,依次递增一,在定义时也可赋初值。
enum game clr=play;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr=5; //ok?没有实际的意义。
联合(共用体)
是一种特殊的自定义类型,特征是这些成员公用同一块空间(所以联合也叫共用体)。
union Un
{
char c;
int i;
};
union Un A;
printf("%d\n",sizeof( A));//4
面试题:判断当前计算机的大小端存储。
eg:
>union Un
{
char c;
int i;
};
union Un A;
A.i=0x11223344;
A.c=0x55;
printf("%x\n",A.i);//11223355
说明是小端存储
*小端存储是低字节序存在低地址处,故44被55取代;
大端存储是高字节序存在低地址处,故11倍55取代。*
联合体大小的计算:
“`
union Un
{
char c[5];
int i;
};
printf("%d\n",sizeof(union Un));//8
“`最大成员大小为5,最大对齐数为4,要对齐到最大对齐数的整数倍,故为8