首页 > 其他分享 >共用体、typedef、位运算

共用体、typedef、位运算

时间:2024-08-02 20:24:03浏览次数:18  
标签:typedef 运算 int 成员 类型 共用 data

共用体

定义

  • 共用体是一个用户自定义的类型,包含多个不同类型的成员,但在同一时间只能存储其中一个成员的值。
  • 共用体的声明类似于结构体,但使用关键字 union
union Example {
    int i;
    float f;
    char c;
};

 

内存分配

  • 共用体的大小等于其最大成员的大小。例如,如果共用体包含一个 int(4字节)、一个 float(4字节)和一个 char(1字节),则共用体的大小为4字节。
  • 这种存储方式允许不同类型的数据在同一块内存区域中存储,从而节省内存。

访问成员

  • 可以通过使用点运算符(.)访问共用体的成员。由于所有成员共享同一内存,因此在任何时候只能访问最后写入的成员。
  • 访问未定义的成员值是未定义行为
union Example e;
e.i = 42;
printf("%d\n", e.i); // 输出:42
e.f = 3.14f;
printf("%f\n", e.f); // 输出:3.140000

用途

  • 节省内存:在内存有限或需要高效内存使用的嵌入式系统中,共用体非常有用。
  • 类型转换:共用体可以用来在不同类型之间进行低级别的类型转换。例如,可以通过共用体将浮点数的位模式解释为整数类型。

共用体与结构体的区别

  • 内存分配:结构体的大小是其所有成员的大小总和,而共用体的大小是其最大成员的大小。
  • 成员访问:结构体中的所有成员都有独立的内存空间,可以同时访问;共用体只能同时存储一个成员的值。

 

#include <stdio.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    
    data.i = 10;
    printf("data.i : %d\n", data.i);
    
    data.f = 220.5;
    printf("data.f : %f\n", data.f);
    
    strcpy(data.str, "C Programming");
    printf("data.str : %s\n", data.str);
    
    return 0;
}

 共用体 Data 依次存储了整数、浮点数和字符串。最后访问的成员 data.str,覆盖了之前的值。

typedef

typedef 是 C 语言中的一个关键字,用于为现有的数据类型定义新的类型名称。它的主要目的是提高代码的可读性、可维护性和简化复杂类型的使用

typedef existing_type new_type_name;
  • existing_type 是已经存在的类型,可以是基本数据类型(如 intfloat)或复合类型(如结构体、共用体、指针等)。
  • new_type_name 是新的类型名,用户可以在代码中使用它来替代 existing_type

简化复杂类型的定义

  • 对于复杂的类型声明(如指向函数的指针),使用 typedef 可以使代码更简洁和易读
    typedef void (*func_ptr)(int, int);
    

  • 上述定义创建了一个新的类型 func_ptr,它表示一个指向以两个 int 作为参数、返回类型为 void 的函数的指针。

  • 提高代码的可读性

  • 使用 typedef 可以为类型创建更具描述性的名称,从而使代码更易于理解。
    typedef unsigned long ulong;
    

    unsigned long 类型定义为 ulong,使其在使用时更加简洁

  • 提高代码的可维护性

  • 在需要改变类型定义的情况下,只需修改 typedef 的定义,而不需要修改代码中所有出现该类型的地方。
    typedef int size;
    size x, y;
    

    若以后需要将 size 类型改为 long,只需修改 typedef int size;typedef long size;

 

与结构体、共用体和枚举配合使用

  • 使用 typedef 可以为结构体、共用体和枚举类型定义新的名称,简化它们的使用。
typedef struct {
    int x;
    int y;
} Point;

Point p1;

定义了一个结构体类型 Point,并使用它来声明变量 p1。 

  • typedef 仅仅是创建了类型的别名,它不会创建新的类型。类型别名在编译器看来与原类型完全相同。
  • typedef 的定义通常放在头文件中,以便在多个源文件中共享。

 位运算

位运算符

  1. 按位与 (&)

    • 对应位都为1时,结果为1;否则为0。
    • 常用于清零操作、保留某些位。
    int a = 5; // 0101
    int b = 3; // 0011
    int result = a & b; // 结果:0001,即1
    

    2.按位或 (|)

  1. 对应位有一个为1,结果即为1。常用于设置某些位。

int a = 5; // 0101
int b = 3; // 0011
int result = a | b; // 结果:0111,即7

按位异或 (^)

  • 对应位不同则结果为1,相同则为0。
  • 常用于翻转某些位、比较两个值是否不同。

 

int a = 5; // 0101
int b = 3; // 0011
int result = a ^ b; // 结果:0110,即6

 

按位取反 (~)

  • 对每个二进制位进行取反操作,即0变1,1变0。
int a = 5; // 0101
int result = ~a; // 结果:1010(补码表示-6)

左移 (<<)

  • 将位向左移动指定的位数,右边补0。
  • 相当于乘以2的若干次幂。
int a = 5; // 0101
int result = a << 1; // 结果:1010,即10
int a = 5; // 0101
int result = a >> 1; // 结果:0010,即2
  • 将位向右移动指定的位数。
  • 如果是无符号数,左边补0;如果是有符号数,行为依赖于编译器(有符号位扩展和逻辑右移两种可能)。

笔记详解 

标签:typedef,运算,int,成员,类型,共用,data
From: https://blog.csdn.net/a8687216/article/details/140879166

相关文章

  • 【C++】运算符重载
    一、示例如果我想实现以下代码,按照下面的写法是不能正常运行的。classPerson{public:intm_A;intm_B;};Personp1;p1.m_A=10;p1.m_B=10;Personp2;p2.m_A=10;p2.m_B=10;Personp3;p3=p1+p2;按照以上学过的内容,可以自己写成员函数,实......
  • 链表尾插法、头删、尾删,共用体、位运算。
    一、链表1、尾插程序:2、头删3、尾删4、清空链表二、共用体1、定义:union 共用体名(首字母大写。所占字节大小:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。但是整体大......
  • Luogu P5005 中国象棋 - 摆上马 / Luogu P8756 国际象棋 题解 [ 蓝 ] [ 状压 dp ] [
    国际象棋:模板棋盘状压。摆上马:需要点思维的棋盘状压,相比上一道题加了“蹩马脚”的设定。Easy_version:国际象棋概述一下此类棋盘问题的思路:用二进制数表示出棋盘上某一行的状态。用位运算预处理出合法的单行状态,以及需要用到的一些东西。用位运算判断前一行或者前几行能否......
  • 学习C语言的第4天--运算符与流程控制
    今日目标了解各种运算符及其用法。掌握条件语句和循环语句的使用。每日练习目录今日目标运算符1.算术运算符2.关系运算符3.逻辑运算符4.位运算符5.赋值运算符6.其他运算符条件运算符(三元运算符)指针运算符逗号运算符流程控制1.条件语句if语句if-else语句......
  • 几个典型运算符之间的区别
    几个典型运算符之间的区别1.i++与++ii++(后缀递增运算符):这被称为后缀递增运算符。它首先返回变量i的当前值,然后将i的值增加1。通常用于循环计数器的递增。++i(前缀递增运算符):这被称为前缀递增运算符。它首先将i的值增加1,然后返回新的值。通常用于确保变量的值......
  • Java中的运算符
    Java中的运算符Java中的运算符用于执行程序中的各种操作,如赋值、算术运算、比较、逻辑运算等。以下是Java中的主要运算符类型及其用法:赋值运算符(=):用于将右侧的值赋给左侧的变量。算术运算符:+加法-减法*乘法/除法%取模(求余数)++递增(使变量值增加1)--......
  • C/C++ 运算符优先级相关的注意事项
    在C/C++中,运算符优先级决定了表达式中各部分的计算顺序。理解并正确应用运算符优先级是确保程序逻辑正确性的关键。以下是关于C/C++运算符优先级相关的一些重要注意事项:优先级层次:C/C++中的运算符按优先级从高到低排序。例如,算术运算符(+、-、*、/)的优先级高于赋值运算符(=)......
  • 类型转换运算符
    1.作用类通过自定义的类型转换运算符,可以将一个类型转换成另一个类型。例如将自定义的Student类转换成std::string类。虽然在格式上和运算符重载类似,但运算符重载是一个成员函数,而类型转换运算符不是,因为没有返回值。2.格式operatortype()[const];type:表示转化后的数据......
  • C语言运算符深度解析--超详细
    引言在C语言的浩瀚宇宙中,运算符如同点亮星辰的魔法棒,它们不仅连接着数据的海洋,更驱动着程序的逻辑流转。从基础的算术运算到复杂的位操作,每一个运算符都承载着特定的功能,是构建程序逻辑的基石。掌握C语言的运算符,就如同手握开启编程世界大门的钥匙,让你能够自如地编写出高效、精准......
  • 顺序消费rocketMQ(FIFO先进先出)和小技巧 取模运算的周期性特征来将数据分组。
    20240801一、顺序消费MQ(FIFO先进先出)介绍二、一个小技巧,对于取模运算,用来在几以前进行随机选取,取模运算的周期性特征来将数据分组,使用场景对于取模会重复问题一、顺序消费MQ(FIFO先进先出)介绍发送顺序和消费顺序保持一致默认情况消费方式是并发模式,会导致消息乱序......