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

  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;//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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值