5.1 KiB
5.1 KiB
好,这个问题问得非常对味 👍
你现在这个阶段,就该把 C 的类型系统一次性“扫干净”,否则后面看 SDL / 源码 / 系统接口永远会被各种 uint32_t、size_t、intptr_t 绊住。
下面我给你一份 「工程级·C语言数据类型大全」,按来源 + 本质来分,保证你以后看到一个类型就知道它“从哪来、干嘛用、多大”。
一、C 语言内建基本类型(语言核心)
这是 C 语法本体,不需要
#include
1️⃣ 整型(Integer types)
(1)字符整型
char // 至少 8 位(实现定义)
signed char // 至少 8 位
unsigned char // 至少 8 位
⚠️ 注意:
char≠signed char≠unsigned charchar是否有符号是实现定义
(2)短整型
short
short int
signed short
signed short int
unsigned short
unsigned short int
- 至少 16 位
- 常见:16 位
(3)整型(最常用)
int
signed int
unsigned int
-
至少 16 位
-
常见:
- 32 位(现代系统)
(4)长整型
long
long int
signed long
unsigned long
-
至少 32 位
-
常见:
- Linux x64:64 位
- Windows x64:32 位(LLP64)
(5)长长整型(C99)
long long
long long int
signed long long
unsigned long long
- 至少 64 位
- 基本稳定为 64 位
2️⃣ 浮点类型
float // 单精度
double // 双精度
long double // 扩展精度(实现定义)
常见:
| 类型 | 位数 |
|---|---|
| float | 32 |
| double | 64 |
| long double | 80 / 128 / 64 |
3️⃣ 布尔类型(C99)
#include <stdbool.h>
bool // 实际是 _Bool
_Bool
_Bool是内建类型bool是宏别名
4️⃣ 空类型
void
用途:
- 无返回值
- 泛型指针
void*
二、修饰符(类型“调味料”)
这些不是独立类型,而是修饰已有类型:
signed
unsigned
short
long
合法组合例子:
unsigned long long int
signed short
long double
非法组合:
unsigned float ❌
short double ❌
三、固定宽度整数(stdint.h,强烈推荐)
你看到的
int64_t、uint32_t全在这
#include <stdint.h>
1️⃣ 精确宽度(一定存在才定义)
int8_t uint8_t
int16_t uint16_t
int32_t uint32_t
int64_t uint64_t
✔ 最常用、最安全
2️⃣ 至少 N 位
int_least8_t
int_least16_t
int_least32_t
int_least64_t
3️⃣ 最快类型
int_fast8_t
int_fast16_t
int_fast32_t
int_fast64_t
4️⃣ 指针等宽整数(系统编程必备)
intptr_t
uintptr_t
👉 能安全存放指针的整数
5️⃣ 最大整数类型
intmax_t
uintmax_t
四、常见 typedef(标准库里“看起来像关键字的东西”)
1️⃣ stddef.h
size_t // sizeof 的结果类型(无符号)
ptrdiff_t // 指针差值(有符号)
nullptr_t // C23
2️⃣ limits.h / stdint.h
CHAR_BIT // 一个字节多少 bit(通常 8)
INT_MAX
UINT_MAX
3️⃣ sys/types.h(POSIX)
ssize_t // size_t 的有符号版
off_t // 文件偏移
pid_t // 进程 ID
五、字符 & 文本相关类型
char // 字节 / UTF-8
wchar_t // 宽字符(平台相关)
C11 还支持:
char16_t
char32_t
(但在 C 里用得不多)
六、非标准但“到处都是”的别名(你问的 uint / uchar)
⚠️ 这些不是 C 标准!
常见于:
- Windows
- 嵌入式
- 老代码
- 游戏 / 引擎
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef long long int64;
typedef unsigned long long uint64;
👉 完全是项目自定义 👉 千万别假设它们存在
七、复合类型(不是基本类型,但必须知道)
struct
union
enum
以及:
typedef
八、函数 / 指针 / 数组“伪类型”
int* p;
int (*fp)(int);
int arr[10];
它们不是新类型,而是类型构造方式
九、一张“终极速查表”(你该背的)
✅ 必背
charintlonglong longfloatdoublevoidsize_tintptr_tint32_t / uint32_tint64_t / uint64_tbool
❌ 不该依赖
uintucharDWORDBYTE
最后一句工程建议(很重要)
写现代 C:
- 用
stdint.h- 用
size_t- 少猜位宽
- 不造轮子 typedef
如果你愿意,下一步我可以帮你做一件事之一:
- 🔍 把 SDL 里所有 typedef 拆给你看
- 🧠 给你出 “看到类型 → 推断平台行为”训练题
- 🧱 教你 自己写一个干净的
types.h
你选一个,我接着往下带你。