【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日
      浏览(13)
    • 自定义类型详解(结构体+位段+枚举+联合)

      自定义类型详解(结构体+位段+枚举+联合)

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

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

      自定义类型详解 ----结构体,位段,枚举,联合

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

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

      C/C++之自定义类型(结构体,位段,联合体,枚举)详解

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

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

      【C语言:自定义类型(结构体、位段、共用体、枚举)】

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

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

      【C语言进阶(七)】自定义类型--结构体,位段,联合

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

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

      【C语言】联合和枚举

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

      2024年04月14日
      浏览(10)
    • C语言之 结构体,枚举,联合

      C语言之 结构体,枚举,联合

      逝者如斯夫,不舍昼夜 目录 1.结构体 1.1结构的基础知识 1.2结构的声明   1.3 特殊的声明 1.4 结构的自引用 1.5 结构体变量的定义和初始化 1.6 结构体内存对齐 1.7 修改默认对齐数 1.8 结构体传参 2. 位段 2.1 什么是位段 2.2位段的内存分配 2.3 位段的跨平台问题 3. 枚举 3.1 枚举类型

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

      【C语言】联合体和枚举

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

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

      c语言-联合体和枚举

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

      2024年02月04日
      浏览(8)

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

    支付宝扫一扫打赏

    博客赞助

    微信扫一扫打赏

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

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

    二维码1

    领取红包

    二维码2

    领红包