C 语言整型大小与平台差异
更新时间:2026-08-26。本文是
languages/c/主题高手层文档。
本文要回答的问题
int一定是 4 字节吗?long呢?stdint.h的int32_t为什么是跨平台的救星?- 写二进制格式时,类型大小不确定会出什么事?
一、基本整型的大小不是铁律
C 标准只规定最小范围,不规定具体字节数,随平台/编译器而异:
| 类型 | 常见(32 位) | 常见(64 位 Linux) | 常见(Windows 64 位) |
|---|---|---|---|
int | 4 字节 | 4 字节 | 4 字节 |
long | 4 字节 | 8 字节 | 4 字节 |
long long | 8 字节 | 8 字节 | 8 字节 |
| 指针 | 4 字节 | 8 字节 | 8 字节 |
坑:long 在 Linux x86-64 是 8 字节、在 Windows 是 4 字节——同一份代码两边 sizeof(long) 不一样。
二、stdint.h:固定宽度类型
| 类型 | 含义 |
|---|---|
int8_t / uint8_t | 恰好 1 字节 |
int16_t / uint16_t | 恰好 2 字节 |
int32_t / uint32_t | 恰好 4 字节 |
int64_t / uint64_t | 恰好 8 字节 |
固定宽度类型用于:二进制文件/网络协议格式、序列化、位操作——只要数据要跨平台持久化或传输,就明确指定宽度,别依赖 int/long 的"碰巧"。
三、选择策略
- 本地计算、范围够用:直接用
int(性能通常最优)。 - 明确宽度需求:用
stdint.h固定类型。 - 可移植代码的通用整型:用
size_t(无符号、装得下任何对象大小)。 - 避免:拿
long当"大 int",跨平台大小不一致。
实测:本机(Linux x86-64)整型大小
c
printf("int=%zu long=%zu long long=%zu void*=%zu\n",
sizeof(int), sizeof(long), sizeof(long long), sizeof(void *));实测:
text
sizeof(int)=4
sizeof(long)=8 ← Linux LP64:long 是 8 字节
sizeof(long long)=8
sizeof(void*)=8
sizeof(int32_t)=4, int64_t=8 ← stdint.h 固定宽度,跨平台一致关键:long 在这里是 8 字节(Linux LP64 模型),但 Windows(LLP64)上是 4 字节——所以跨平台代码别用 long 当"64 位整型",要用 int64_t。
四、与入门层的衔接
- typedef 定义类型别名,见 typedef。
- 有符号/无符号转换陷阱,见 有符号与无符号。
- 二进制读写时类型宽度,见 fread/fwrite。
一句话总结
int/long 的大小是平台说了算、不是标准说了算:数据要跨平台就上 stdint.h 固定宽度,本地计算用 int 就好,别用 long 假装自己是"大号 int"。
本文已完成填充:示例代码与实测数据已补齐。