首页 > 其他分享 >[C][自定义类型][二][位段][枚举][联合体]详细讲解

[C][自定义类型][二][位段][枚举][联合体]详细讲解

时间:2024-05-28 12:32:39浏览次数:20  
标签:定义 自定义 int 成员 enum 位段 枚举

目录


1.位段

1.什么是位段?

  • 位段的声明和结构是类似的,但有两个不同
    • 位段的成员必须是intunsigned intsigned int
    • 位段的成员名后边有一个冒号和一个数字(指占几个bit位)
      struct A
      {
          int _a:3;
          int _b:4;
          int _c:5;
          int _d:4;
      };
      

2.位段的内存分配

  • 位段的成员可以是intunsigned intsigned intchar(属于整形家族)
  • 位段的空间按照需要,以4个字节(int)或者1个字节(char)的方式来开辟的
  • 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
  • 当十进制转化为二进制时,超出的部分会被截断
    请添加图片描述

3.位段的跨平台问题

  • int位段被当成有符号数还是无符号数是不确定的
  • 位段中最大位的数目不能确定
    • 16位机器最大16,32位机器最大32,写成27,在16位机器会出问题
  • 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
  • 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的
  • 总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在

4.位段的应用

  • 例如:UDP、TCP报头等
    请添加图片描述

2.枚举

1.什么是枚举?

  • 枚举顾名思义就是一一列举
  • 把可能的取值一一列举

2.枚举类型的定义

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

3.枚举的优点

  • 可以使用#define定义常量,为什么非要使用枚举?
    • 增加代码的可读性和可维护性
    • #define定义的标识符相比,枚举有类型检查,更加严谨
    • 防止了命名污染(封装)
    • 便于调试
    • 使用方便,一次可以定义多个常量
  • 总结:能用枚举就用枚举,不用define 没办法再用define
  • 可读性和可维护性举例
    void Menu()
    {
    	printf("*********************************\n");
    	printf("****   1. Add       2. Sub   ****\n");
    	printf("****   3. Mul       4. Div   ****\n");
    	printf("****   0. Exit               ****\n");
    	printf("*********************************\n");
    }
    
    enum Option
    {
    	EXIT, // 0
    	ADD,  // 1
    	SUB,  // 2
    	MUL,  // 3
    	DIV   // 4
    };
    
    void main()
    {
    	int input = 0;
    	do
    	{
    		Menu();
    		Printf("请选择:>");
    		scanf("%d", &input);
    		switch(input)
    		{
    		case ADD:
    			// ...
    		case SUB:
    			// ...
    		case MUL:
    		// ...
    		case DIV:
    		// ...
    		case EXIT:
    		// ...
    		default:
    		// ...
    		}
    	}while(input);
    }
    

4.枚举的使用

enum Color//颜色
{
    RED=1,
    GREEN=2,
    BLUE=4
};
enum Color clr = GREEN; // 只能拿枚举常量给枚举变量赋值,才不会出现类型的差异
clr = 5;                // error,clr为num常量,赋初值后不可改变

3.联合体(共用体)

1.联合类型的定义

  • 联合也是一种特殊的自定义类型
  • 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间
    • 所以联合也叫共用体
    • 联合体内,所有成员的起始地址都是一样的
  • 联合体也可以使用. ->访问
  • 例如:所占空间为4byte
	// 联合类型的声明
	union Un
	{
	    char c;
	    int i;
	};
	// 联合变量的定义
	union Un un;
	```
## 2.联合的特点 && 计算

- 联合的成员是共用同一块内存空间的
- **联合体的大小至少是最大成员的大小**
	- 因为联合体至少得有能力保存最大的那个成员
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

标签:定义,自定义,int,成员,enum,位段,枚举
From: https://blog.csdn.net/qq_37281656/article/details/139249123

相关文章

  • 枚举(C语言)
    1.枚举定义枚举是C语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。定义一个枚举类型,需要使用 enum 关键字,后面跟着枚举类型的名称,以及用大括号 {} ......
  • 自定义CSS属性(@property)解决自定义CSS变量无法实现过渡效果的问题
    且看下面的代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>demot</t......
  • 位段(详解)
        今天让我们来了解c语言中的位段    什么是位段?        位段可以理解为结构体的一种,但是我们需要了解位段与结构体的不同之处    1.位段的成员必须是int,unsignedint,signedint类型。    2.位段的成员名后面都有一个冒号和一个......
  • 枚举是尊嘟很暴力——奥数篇
    还是枚举,因为基础不怎么扎实,就多写一点博客激励自己。这种的话,你受益,我也收益,双赢的局面。题目描述:赵火华同学上课的时候遇到了一道《史诗级》奥数难题:□□□+□□□=□□□,将1~9的数字分别填入□中,每个数字只能用一次。赵火华第一个想到的就是枚举,但是脑子晕的厉害,就想到......
  • 【ROS】-- 自定义回调队列
    在ros中,我们常用的回调处理是ros::spin()或者ros::spinOnce(),但是,这两个是阻塞式单线程处理的,即当不做其他处理的情况下,某一个回调函数堵塞,其他topic或者service的回调函数就无法进入。使用ros多线程的方式可以解决该问题,但引入多线程会导致线程安全的问题。针对某些场景,......
  • 个人原创自定义计算公式组件可继续扩展
    <template><div><el-row><el-col:span="24"><el-container><el-main><el-card><div><el-button......
  • 小程序自定义swiper的指示点样式及颜色
    1图居中、圆边角、指示点颜色更改、指示点样式更改下图是样式不好看的组件要修改成这样::  wxml:<swiperclass="bd"indicator-dots="{{true}}"indicator-active-color="#ff8f00"autoplay="{{true}}"interval="5000"duration="500">......
  • ocelot自定义认证token
    中间件publicclassCustomOcelotMiddleware:Ocelot.Middleware.OcelotMiddleware{privatereadonlyRequestDelegate_next;publicIConfiguration_configuration;privatereadonlyIAuth_authUtil;privatereadonlySysLogApp_logApp;......
  • 警惕!自定义注解使用不当的排查实录
    一、引言大家好,在日常开发过程中,Java注解(Annotation)是开发中经常使用的一个手段,用于给代码添加元数据的标记。它们可以提供代码额外的信息,这些信息可以在编译时或运行时被访问。注解不会改变代码的执行逻辑,但可以被编译器、JVM或框架等工具用于生成额外的代码、提供警告或执......
  • custom:用户自定义插件,提供开放能力
    custom插件的功能:支持用户在右键菜单中自定义插件。简介custom插件大量采用声明式代码(声明代替代码开发),比如:只需使用style=()=>"...",即可注册css。只需使用styleTemplate=()=>({renderArg}),即可引入css文件,并且支持渲染模板。只需使用html=()=>"...",即......