位段、位段计算大小、枚举、联合

来源:互联网 发布:成都病假条淘宝 编辑:程序博客网 时间:2024/05/16 18:04
  1. 位段:成员必须是int 、unsigned int 和signed int .
    位段的成员名后边有一个冒号和一个数字。
  2. 计算:位段是按比特位的大小来进行计算的,比如一个字节有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;//3End//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

阅读全文
0 0
原创粉丝点击