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",跨平台大小不一致。
四、与入门层的衔接
- typedef 定义类型别名,见 typedef。
- 有符号/无符号转换陷阱,见 有符号与无符号。
- 二进制读写时类型宽度,见 fread/fwrite。
一句话总结
int/long 的大小是平台说了算、不是标准说了算:数据要跨平台就上 stdint.h 固定宽度,本地计算用 int 就好,别用 long 假装自己是"大号 int"。
本文为骨架文档:核心结构已就位,示例代码与实测数据将在后续批次补齐。