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 = # // 合法// printf("%d\n", *ptr); // 错误:void* 不能直接解引用
printf("%d\n", *((int*)ptr)); // 正确:先转换为 int*
4. 派生类型 (Derived Types)
这些类型是从基本类型或其它派生类型构造而来的。
a. 指针类型 (Pointer Types)
存储变量的内存地址。声明时在类型名后加 *。
int num = 10;
int *ptr = # // 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):一个指针限定符,向编译器承诺,在该指针的生命周期内,它是访问其所指向数据的唯一方式,从而允许编译器进行优化。