当前位置: 首页 > news >正文

C语言---数据类型

文章目录

  • 数据类型分类
  • 1. 基本类型 (Basic Types)
    • a. 整数类型 (Integer Types)
      • char (字符型)
      • int (整型)
      • short (短整型)
      • long (长整型)
      • long long (C99标准引入)
      • 图片汇总
    • b. 浮点类型 (Floating-Point Types)
      • float (单精度浮点型)
      • double (双精度浮点型)
      • long double (长双精度浮点型)
      • 图片汇总
  • 2. 枚举类型 (Enumeration Type) - enum
  • 3. void 类型
    • 1、作为函数返回类型
    • 2、作为函数参数
    • 3、作为指针类型(万能指针)
  • 4. 派生类型 (Derived Types)
    • a. 指针类型 (Pointer Types)
    • b. 数组类型 (Array Types)
    • c. 结构体类型 (Structure Type) - struct
    • d. 共用体类型 (Union Type) - union
    • e. 函数类型 (Function Types)
  • 类型限定符 (Type Qualifiers)

在 C 语言中,数据类型指用于声明不同类型的变量或函数。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。

数据类型分类

C 语言的数据类型主要可以分为以下几大类:
在这里插入图片描述

1. 基本类型 (Basic Types)

a. 整数类型 (Integer Types)

用于存储整数,可带有符号。
注意:确切的大小和范围依赖于编译器和平台。<limits.h> 头文件定义了这些类型的最大值和最小值(如 INT_MAX, CHAR_BIT 等)。

char (字符型)

用途:存储单个字符(实际上是存储该字符的 ASCII 码)。
大小:通常为 1 字节。
signed char(或直接写char,signed通常可忽略):有符号,范围至少 -128 到 127。
unsigned char:无符号,范围至少 0 到 255。

注意:普通的 char 是否带符号取决于编译器的实现,它可能等同于 signed char 或 unsigned char。如果用于存储小整数,应明确指定 signed 或 unsigned。
在MCU开发中通常使用UI_8、I_8表示C语言中8位的无符号、有符号数据类型。增强工程的可移植性。避免工程师在不同系统下对存储空间大小认知存在偏差导致bug。

int (整型)

用途:最常用的整数类型,用于存储通用整数。
大小:通常为系统字长4字节或者2字节(例如,在 32/64 位系统上通常是 4 字节,部分MCU系统中为2字节)。
范围:至少 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647。
signed int (或直接写 int,signed通常可忽略):有符号。
unsigned int:无符号,范围至少 0 到 65,535 或 0 到 4,294,967,295。

在MCU开发中通常使用UI_32、I_32表示C语言中32位的无符号、有符号数据类型。增强工程的可移植性。避免工程师在不同系统下对存储空间大小认知存在偏差导致bug。

short (短整型)

用途:用于节省空间的较小整数,范围比 int 小。

大小:至少 2 字节。

signed short : -32,768 到 32,767
unsigned short: 0 到 65,535

在MCU开发中通常使用UI_16、I_16表示C语言中16位的无符号、有符号数据类型。增强工程的可移植性。避免工程师在不同系统下对存储空间大小认知存在偏差导致bug。

long (长整型)

用途:存储大范围的整数。

大小:至少 4 字节,部分系统可能是8字节。

signed long:-2,147,483,648 到 2,147,483,647(4字节时)
unsigned long: 0 到 4,294,967,295(4字节时)

long long (C99标准引入)

long long (C99标准引入)

用途:存储非常大范围的整数。

大小:至少 8 字节

signed long long:0 到 18,446,744,073,709,551,615
unsigned long long:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

在MCU开发中通常使用UI_64、I_64表示C语言中64位的无符号、有符号数据类型。增强工程的可移植性。避免工程师在不同系统下对存储空间大小认知存在偏差导致bug。

图片汇总

图片来自菜鸟教程:
菜鸟教程
在这里插入图片描述
在这里插入图片描述

b. 浮点类型 (Floating-Point Types)

用于存储实数(带小数点的数)。
注意:<float.h> 头文件定义了这些类型的精度和范围(如 FLT_DIG, DBL_MAX 等)。

float (单精度浮点型)

大小:通常为 4 字节。

精度:约 6-7 位有效数字。

后缀:字面量后缀 f 或 F,例如 3.14f。

double (双精度浮点型)

大小:通常为 8 字节。

精度:约 15-16 位有效数字。

说明:C 语言中默认的浮点数字面量(如 3.14)都是 double 类型。

long double (长双精度浮点型)

大小:通常为 8、12 或 16 字节,取决于实现。

精度:提供比 double 更高的精度和范围。

图片汇总

图片来自菜鸟教程:
菜鸟教程
在这里插入图片描述

2. 枚举类型 (Enumeration Type) - enum

用于定义一组命名的整数常量,使代码更易读。
枚举变量在C语言中相当于是一个范围限制的整数型,将同一层级同一概念的值封装在一个枚举类型中,提高代码可读性,使用时相当于宏定义。

// 定义了一个枚举类型 enum Color
enum Color {RED,    // 默认值为 0GREEN,  // 默认值为 1BLUE    // 默认值为 2
};// 声明一个枚举变量
enum Color myColor = GREEN;
printf("%d\n", myColor); // 输出 1// 可以显式指定值
enum Status {ERROR = -1,SUCCESS = 0,PENDING = 1
};

3. void 类型

void 类型表示“无”或“空”。

1、作为函数返回类型

表示函数不返回任何值。

void sayHello() {printf("Hello\n");// 无需 return 语句,或使用 return;
}

2、作为函数参数

表示函数不接受任何参数。

int getRandomNumber(void) { // 明确表示无参数return rand();
}

3、作为指针类型(万能指针)

void* 是一种通用指针类型,可以指向任何数据类型的数据。在使用前必须进行强制类型转换。

int num = 10;
void *ptr = &num; // 合法// printf("%d\n", *ptr); // 错误:void* 不能直接解引用
printf("%d\n", *((int*)ptr)); // 正确:先转换为 int*

4. 派生类型 (Derived Types)

这些类型是从基本类型或其它派生类型构造而来的。

a. 指针类型 (Pointer Types)

存储变量的内存地址。声明时在类型名后加 *。

int num = 10;
int *ptr = &num; // ptr 是一个指向 int 的指针,存储了 num 的地址printf("%d\n", *ptr); // 解引用指针,获取它指向的值(输出 10

b. 数组类型 (Array Types)

存储相同类型的元素的集合。声明时在变量名后加 [size]。

int numbers[5] = {1, 2, 3, 4, 5}; // 包含 5 个整数的数组
char str[] = "Hello"; // 编译器自动计算大小的字符数组(字符串)

c. 结构体类型 (Structure Type) - struct

将多个不同类型的变量组合成一个单一的复合类型。

// 定义了一个结构体类型 struct Person
struct Person {char name[50];int age;float height;
};// 声明一个结构体变量并初始化
struct Person p1 = {"Alice", 30, 165.5};// 访问成员
printf("Name: %s, Age: %d\n", p1.name, p1.age);

d. 共用体类型 (Union Type) - union

允许在同一内存位置存储不同的数据类型。所有成员共享同一块内存,大小由最大的成员决定。

union Data {int i;float f;char str[20];
};union Data data;
data.i = 10; // 现在 data 存储的是一个整数
data.f = 220.5; // 写入一个浮点数,会覆盖之前的整数
// 此时读取 data.i 将是无意义的值

e. 函数类型 (Function Types)

函数也有类型,由其返回类型和参数类型决定。这在函数指针中非常有用。

// 一个函数类型:返回 int,接受两个 int 参数
int add(int a, int b) {return a + b;
}// 声明一个匹配该类型的函数指针
int (*funcPtr)(int, int) = add;// 通过函数指针调用函数
int result = funcPtr(3, 4); // result = 7

类型限定符 (Type Qualifiers)

为类型提供额外的属性。
1、const:定义常量,值在初始化后不能被修改。

const int max_size = 100;
// max_size = 200; // 编译错误!

2、volatile:告诉编译器该变量可能被程序之外的代理(如硬件、中断)修改,禁止编译器做某些优化。

volatile int hardware_register;

3、restrict (C99):一个指针限定符,向编译器承诺,在该指针的生命周期内,它是访问其所指向数据的唯一方式,从而允许编译器进行优化。

http://www.xdnf.cn/news/1352431.html

相关文章:

  • PyTorch生成式人工智能——VQ-VAE详解与实现
  • TypeScript 的泛型(Generics)作用理解
  • Kafka 概念与概述
  • 在TencentOS3上部署OpenTenBase:从入门到实战的完整指南
  • 【Java学习笔记】18.反射与注解的应用
  • 遥感机器学习入门实战教程|Sklearn案例⑧:评估指标(metrics)全解析
  • tcpdump命令打印抓包信息
  • 【golang】ORM框架操作数据库
  • 2-5.Python 编码基础 - 键盘输入
  • STM32CubeIDE V1.9.0下载资源链接
  • 醋酸镨:催化剂领域的璀璨新星
  • LangChain4J-基础(整合Spring、RAG、MCP、向量数据库、提示词、流式输出)
  • 信贷模型域——信贷获客模型(获客模型)
  • 温度对直线导轨的性能有哪些影响?
  • 小白向:Obsidian(Markdown语法学习)快速入门完全指南:从零开始构建你的第二大脑(免费好用的笔记软件的知识管理系统)、黑曜石笔记
  • 数字经济、全球化与5G催生域名新价值的逻辑与实践路径
  • 快速掌握Java非线性数据结构:树(二叉树、平衡二叉树、多路平衡树)、堆、图【算法必备】
  • vue3 - 组件间的传值
  • 【小沐学GIS】基于Godot绘制三维数字地球Earth(Godot)
  • 计算机网络 TLS握手中三个随机数详解
  • 【Golang】有关垃圾收集器的笔记
  • 语义通信高斯信道仿真代码
  • GaussDB 数据库架构师修炼(十八) SQL引擎-计划管理-SQL PATCH
  • Base64编码、AES加密、RSA加密、MD5加密
  • RAG Embeddings 向量数据库
  • 使用Ollama部署自己的本地模型
  • 疯狂星期四文案网第48天运营日记
  • 12 SQL进阶-锁(8.20)
  • Python语法速成课程(二)
  • 科技赋能,宁夏农业绘就塞上新“丰”景