【C语言】位段枚举联合

这篇具有很好参考价值的文章主要介绍了【C语言】位段枚举联合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

鹅,鹅,鹅,曲项向天歌。白毛浮绿水,红掌拨清波。 — 唐代·骆宾王《咏鹅》

【C语言】位段枚举联合,C语言,c语言,笔记,经验分享


    这篇博客我们会详细介绍位段,以及枚举类型和联合类型
    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享

    位段是什么?🍀

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

    struct A
    {
     int _a:2; //a这个成员只占2个bit位  
     int _b:5; //b这个成员只占5个bit位
     int _c:10;
     int _d:30;
    };
    

    这个A就是一个位段类型 。
    但是我们要根据需求来决定:后分配几个比特位比如下面的情况:

    int _a:2;
    //_a这个成员只占2个bit位 
    只有两个比特位的取值就是下面
    //00-0
    //01-1
    //10-2
    //11-3
    只可能表达0~34个值没有其他值
    

    有些时候不需要那么大一个int 所以才用位段。

    位段的内存分配🐽

    1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
    2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
    3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。(我们讲的是VS的)
    struct A
    {
    	int _a : 2;//_a这个成员只占2个bit位
    	int _b : 5;//_b这个成员只占5个bit位
    	int _c : 10;
    	int _d : 30;
    };//8
    
    int main()
    {
    	printf("%d\n", sizeof(struct A));
    
    	return 0;
    }
    
    1. int 在32位下是32bit, _a占2 _b占5 _c占10 还剩下15。
    2. 这15个比特位就直接给_d使用吗?这个要取决于编译器,还剩15个d肯定是不够的。
    3. 我们肯定要开辟另外4个字节,那么问题来了,还剩的这15个我们用不用?反正VS不用。
      接下来我们更仔细的研究一下
    struct S
    {
    	char a : 3;
    	char b : 4;
    	char c : 5;
    	char d : 4;
    };
    
    int main()
    {
    	struct S s = { 0 };
    	printf("%d\n", sizeof(s));
    
    	s.a = 10;
    	s.b = 12;
    	s.c = 3;
    	s.d = 4;
    
    	return 0;
    }
    

    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享
    这就是在内存的排列方式。

    位段的跨平台问题

    1. int 位段被当成有符号数还是无符号数是不确定的。
    2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
      器会出问题。
    3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
    4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
      舍弃剩余的位还是利用,这是不确定的。

    枚举✳️

    枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中:
    一周的星期一到星期日是有限的7天,可以一一列举
    性别有:男、女、保密,也可以一一列举。
    月份有12个月,也可以一一列举
    这里就可以使用枚举了。

    enum Day//星期
    {
     Mon,
     Tues,
     Wed,
     Thur,
     Fri,
     Sat,
     Sun
    };
    enum Sex//性别
    {
     MALE,
     FEMALE,
     SECRET
    }enum Color//颜色
    {
     RED,
     GREEN,
     BLUE
    };
    

    以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
    {}中的内容是枚举类型的可能取值,也叫 枚举常量 。
    这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。

    enum Color//颜色
    {
     RED=1,
     GREEN=2,
     BLUE=4
    };
    

    枚举的优点 🦑

    为什么使用枚举?
    我们可以使用 #define 定义常量,为什么非要使用枚举?
    枚举的优点:

    1. 增加代码的可读性和可维护性 (类似Switch的case 1 改成 case Add)
    2. 和#define定义的标识符比较枚举有类型检查,更加严谨。(C语言检查不够严格,cpp更严格)enum Color c = 5; 5 是int类型 c 是enum color类型
    3. 防止了命名污染(封装)限制了使用范围,而#define全局使用
    4. 便于调试调试发生在.exe,而enum在调试的时候跟我们看到的是一样的,而#define不一样变成了#define定义的值
    5. 使用方便,一次可以定义多个常量 (#define太麻烦而且一次只能定义一个)

    枚举的使用

    enum Color//颜色
    {
     RED=1,
     GREEN=2,
     BLUE=4
    };
    enum Color clr = GREEN;
    //只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
    clr = 5;               上面已经讲过了,
    

    联合体(共用体)🐣

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

    比如:

    union Un
    {
    	char c;//1
    	int i;//4
    };
    
    int main()
    {
    	union Un u;
    	
    	printf("%d", sizeof(u));
    
    	return 0;
    }
    

    那么这个联合体大小为多少呢?
    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享
    为什么?,我们来探究。

    union Un
    {
    	char c;//1
    	int i;//4
    };
    int main()
    {
    	union Un u;
    	printf("%d\n", sizeof(u));
    	printf("%p\n", &u);
    	printf("%p\n", &(u.c));
    	printf("%p\n", &(u.i));
    	return 0;
    }
    

    我们尝试打印一下联合体的地址,以及c变量,i变量的地址。
    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享
    发现居然都是一样的!
    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享
    我们画图简单的表述一下就知道了,这就是共用的意义。那么我们可以合理的想象,如果c变量中放了一个值,如果再在i变量中放一个值是不是就会把c变量的值改变呢?或者反过来也是一样呢?
    在介绍一个问题之前我们先介绍一下联合体的原则:
    联合的成员是共用同一块内存空间的这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)。

    联合的特点

    //下面输出的结果是什么?
    un.i = 0x11223344;
    un.c = 0x55;
    printf("%x\n", un.i);
    

    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享
    这就是跟小端有关系了。
    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享

    联合大小的计算 💥

    ● 联合的大小至少是最大成员的大小。
    ● 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
    比如:

     union Un1
    {
     char c[5];//1
     int i;//4
    
    
      //0      char   
      //1      char
      //2      char
      //3      char
      //4      char
    
       共用前4个字节   int
       一共是5个字节再对齐到8    
        
    };
    

    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享

    union Un2
    {
        short c[7];
        int i;//公用前4个字节
    };
    //  c:2-15 
    //  i:2-5
    //下面输出的结果是什么?
    int main()
    {
        printf("%d\n", sizeof(union Un2));
        return 0;
    }
    

    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享

    总结😈

    这篇博客是用来梳理位段枚举联合的相关知识的,能让我们很好的了解位段枚举联合的特性和运用,让我们的C语言功底更上一层楼 完(๑′ᴗ‵๑)
    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享【C语言】位段枚举联合,C语言,c语言,笔记,经验分享

    【C语言】位段枚举联合,C语言,c语言,笔记,经验分享文章来源地址https://www.toymoban.com/news/detail-610222.html

    到了这里,关于【C语言】位段枚举联合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

    领支付宝红包 赞助服务器费用

    相关文章

    • 【无标题】自定义类型:位段,枚举,联合

      在结构体进阶中,我们详细介绍过了结构体。 接下来就是结构体实现位段的功能。 位段的声明和结构是类似的,但有两个不同: ①: 位段的成员必须是int、unsigned int或signed int。 ②: 位段的成员名后边有一个冒号和一个数字。 比如: A就是一个位段类型! 那位段A的大小是

      2024年02月15日
      浏览(40)
    • 自定义类型详解 ----结构体,位段,枚举,联合

      目录 结构体 1.不完全声明 2.结构体的自引用 3.定义与初始化 4.结构体内存对齐与结构体类型的大小 结构体嵌套问题 位段 1.什么是位段? 2.位段的内存分配 枚举 1.枚举类型的定义 2.枚举的优点 联合(共同体) 1.联合体类型的声明以及变量定义 2.联合体的特点 利用联合体判断

      2024年02月19日
      浏览(34)
    • 自定义类型详解(结构体+位段+枚举+联合)

      你好,我是史丰源 欢迎你的来访,希望我的博客能给你带来一些帮助。 我的Gitee: 代码仓库☀️ 我的联系方式: QQ:1756786195 邮箱:Marksky126@outlook.com🌐 1.11我们为什么需要结构体? C语言中的类型是单一的,如果我们需要去形容一个复杂对象,就需要结构体. 之所以叫结构体

      2023年04月08日
      浏览(59)
    • C/C++之自定义类型(结构体,位段,联合体,枚举)详解

      专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 个人主页:点我进入主页   1.前言 2.结构体 2.1结构体声明 2.2结构体初始化 2.3结构体的自引用 2,4结构体的内存

      2024年02月08日
      浏览(40)
    • 【C语言:自定义类型(结构体、位段、共用体、枚举)】

      C语言已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的, 假设我想描述学生,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学生需要名字、年龄、学号、身高、体重等;描述⼀本书需要作者、出版社、定价等。C语言为

      2024年02月05日
      浏览(43)
    • 【C语言进阶(七)】自定义类型--结构体,位段,联合

      💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 文章目标: 本篇文章着重给大家讲解: 结构体内存对齐的知识 并且介绍位段,联合的内容 最后对这一板块做出拓展 结构体,位段和

      2024年02月15日
      浏览(43)
    • 【C语言】联合和枚举

      个人主页点这里~ 联合体的定义与结构体相似,但是联合体往往会节省更多的空间,它的特点是所有成员共用一块内存空间,结构体也叫共用体 联合体中给某一成员赋值,其他成员值往往会跟着变化 定义联合体我们用的是union,定义格式与结构体相差不多,大括号里边是成员

      2024年04月14日
      浏览(27)
    • c语言-联合体和枚举

      (1) 像结构体⼀样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。 (2)但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。 (3) 给联合体其中⼀个成员赋值,其他成员的值也跟着

      2024年02月04日
      浏览(44)
    • 【C语言】联合体和枚举

      前言 这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下,让我们好好看看联合体和枚举到底是什么 个人主页:小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录  1. 联合体 1.1 联合体类型的声明  1.2 联合体的特点  1.3 相同成员的结构体和联合体对比  

      2024年04月14日
      浏览(41)
    • c语言-枚举和联合体

      本篇文章介绍c语言中的枚举类型和联合体类型 枚举类型和结构体类型相似,都是一种自定义类型。 定义枚举类型的: enum 枚举类型的定义格式 例如,定义一个星期作为枚举类型 枚举类型的第一个成员的取值默认为0,依次往后递增1, 输出枚举WEEK每个成员的值 修改枚

      2024年01月21日
      浏览(69)

    觉得文章有用就打赏一下文章作者

    支付宝扫一扫打赏

    博客赞助

    微信扫一扫打赏

    请作者喝杯咖啡吧~博客赞助

    支付宝扫一扫领取红包,优惠每天领

    二维码1

    领取红包

    二维码2

    领红包