C语言中的数据类型可以分为三大类:基本数据类型、派生数据类型、用户自定义数据类型。下面详细列出常用和完整的分类(基于C99/C11标准):
1. 基本数据类型(Basic Types)
整数类型(Integer Types)
| 类型 | 别名 | 占用字节(典型) | 取值范围(signed为例) |
|---|
| char | signed char | 1 | -128 ~ 127 |
| unsigned char | | 1 | 0 ~ 255 |
| short int | short | 2 | -32768 ~ 32767 |
| unsigned short int | unsigned short | 2 | 0 ~ 65535 |
| int | signed int | 4(32位/64位常见) | -2³¹ ~ 2³¹-1 |
| unsigned int | unsigned | 4 | 0 ~ 2³²-1 |
| long int | long | 4 或 8(视平台) | 至少 -2³¹ ~ 2³¹-1 |
| unsigned long int | unsigned long | 4 或 8 | 0 ~ 2³²-1 或更大 |
| long long int | long long | 8 | -2⁶³ ~ 2⁶³-1 |
| unsigned long long int | unsigned long long | 8 | 0 ~ 2⁶⁴-1 |
浮点类型(Floating-point Types)
| 类型 | 占用字节 | 精度(大致) | 取值范围 |
|---|
| float | 4 | 约6-7位十进制有效数字 | ≈ ±3.4E±38 |
| double | 8 | 约15-16位十进制有效数字 | ≈ ±1.7E±308 |
| long double | 8/10/12/16(视编译器) | 更高精度 | 更大范围(具体取决于实现) |
布尔类型(C99引入)
_Bool // 占用1字节,取值0或1
bool // 通过 #include <stdbool.h> 使用,更直观
虚空类型(void)
void
2. 派生数据类型(Derived Types)
- 指针(Pointer) 如:int *、char *、void *
- 数组(Array) 如:int a[10]、char str[20]
- 结构体(Structure) struct
- 共用体(Union) union
- 函数(Function) 函数返回类型实际上也是一种派生类型
- 枚举(Enumeration) enum
3. 用户自定义类型
typedef unsigned long long ull;
typedef struct Student { ... } Student;
4. 特殊说明(容易忽略的点)
- char 到底是有符号还是无符号?取决于编译器实现(GCC在多数平台默认signed char)
- sizeof(int) 不是固定的,32位系统通常4字节,64位系统也通常4字节(但C标准只保证至少16位)
- long 在Windows(VS/LP64)是4字节,在Linux 64位(LP64)是8字节
- _Complex 和 _Imaginary(复数类型,C99引入,几乎没人用)
总结表格(最常用的)
| 类型 | 关键字 | 典型大小 | 常用格式说明符 |
|---|
| 字符 | char | 1 | %c |
| 无符号字符 | unsigned char | 1 | %c |
| 短整型 | short | 2 | %hd |
| 无符号短整型 | unsigned short | 2 | %hu |
| 整型 | int | 4 | %d |
| 无符号整型 | unsigned int | 4 | %u |
| 长整型 | long | 4/8 | %ld |
| 无符号长整型 | unsigned long | 4/8 | %lu |
| 长长整型 | long long | 8 | %lld |
| 单精度浮点 | float | 4 | %f |
| 双精度浮点 | double | 8 | %lf |
| 长双精度 | long double | 10-16 | %Lf |
这些就是C语言中全部的数据类型了,记住基本类型 + sizeof + 平台差异这几点,基本不会在面试或实际开发中踩坑。