位段、枚举、联合

本文介绍了C语言中的位段、枚举和联合的概念及使用。位段用于节省内存,但存在跨平台问题;枚举提供了一种定义常量的类型安全方式,增强代码可读性;联合则允许成员共享同一内存空间,其大小由最大成员决定。通过示例代码,展示了如何利用位段检查系统字节序和枚举在内存中的表示。
摘要由CSDN通过智能技术生成
  • 位段 ( 1.位段的内存分配   2.位段的跨平台问题  3.位段的应用)  
  • 枚举 ( 1.枚举类型的定义   2.枚举的优点   3.枚举的使用)       
  • 联合 ( 1.联合类型的定义   2.联合的特点   3.联合大小的计算)

    位段

位段的声明和结构是类似的,有两个不同:1.位段的成员必须是int ,unsigned int 或 signed int。 2.位段的成员名后有一个冒号和一个数字。

位段式结构体:

struct A
{
   int _a:2;
   int _b:5;
   int _c:10;
   int _d:30;
};
#include<stdio.h>
struct S
{
   //位段-二进制位
   int a:2;
   int b:5;
   int c:10;
   int d:30;
};//47bit-6字节-6*8=48bit
int main()
{
   struct S s;
   printf("%d\n",sizeof(s));//输出:8
   return 0;
}

位段的内存分配:

1.位段的成员可以为int , unsigned int ,signed int 或是 char(属于整型家族)类型

2.位段的空间上是按照需要以4个字节(int)或1个字节(char)的方式来开辟的

3.位段涉及很多不确定的因素,位段是不跨平台的,注重可移植的程序应避免使用位段

位段的跨平台问题:

1.int位段被当成有符号数还是无符号数不确定

2.位段中最大位的数目不能确定

3.位段中的成员在内存中分配标准尚未定义

4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,不确定

总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但有跨平台的问题存在。


枚举

枚举即一一列举

枚举类型的定义:

enum Day//星期
{   
   //枚举的可能取值
   Mon,
   Tues,
   Wed,
   Thur,
   Fri,
   Sat,
   Sun
};
//枚举类型
enum Sex
{
   //枚举的可能取值-常量
   WALE=2,
   FEMALE=4,
   SECRET=8
};

{ }中的内容为枚举类型的可能取值,也叫枚举常量

这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可赋初值

枚举的优点:

1.增加代码的可读性和可维护性

2.和#define定义的标识符比较,枚举有类型检查,更严谨

3.防止命名污染

4.便于调试

5.使用方便,一次可定义多个常量


联合

联合-联合体-共用体

联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间。

联合的特点:

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小。

题:判断当前计算机的大小端存储

int check_sys()
{
   union Un
   {
      char c;
      int i;
   }u;
   u.i=1;
   //返回1,表示小端
   //返回0,表示大端
   return u.c;
}
int main()
{
   int a=1;
   int ret=check_sys();
   if(1==ret)
   {
       printf("小端\n");
   }
   else
   {
       printf("大端\n");
   }
}

联合大小的计算:

1.联合的大小至少为最大成员的大小

2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍

union Un
{
   int a;
   char arr[5];
};
int main()
{
   union Un u;
   printf("%d\n",sizeof(u));//输出:8
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

♪Yiiiiiiiiiiiiii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值