int在不同平台上的字节数不固定,c++标准仅要求sizeof(int)≥sizeof(short)且sizeof(int)≤sizeof(long),未规定具体字节数。

int 在不同平台上的字节数不固定
它不是固定的 4 字节,也不是固定的 2 字节——C++ 标准只要求 sizeof(int) >= sizeof(short) 且 sizeof(int) ,实际大小完全取决于编译器和目标平台。
常见情况:
• x86_64 Linux/macOS/Windows(GCC/Clang/MSVC):sizeof(int) 通常是 4
• 一些嵌入式平台(如某些 ARM Cortex-M):可能是 2
• 极少数老系统(如 16 位 DOS 编译器):也可能是 2
别硬记“int 是 4 字节”,用 sizeof 现场查
靠文档或经验猜容易翻车,尤其跨平台移植时。最稳妥的做法是运行时或编译期确认:
static_assert(sizeof(int) == 4, "unexpected int size"); // 编译期检查
// 或运行时:
printf("int: %zu bytes\n", sizeof(int));
• sizeof 返回 size_t,打印用 %zu,不是 %d
• 如果项目要求确定宽度,直接用 int32_t / int64_t 更安全
• int 的符号性是确定的(有符号),但最小值/最大值仍依赖其实际宽度
立即学习“C++免费学习笔记(深入)”;
和 long、long long 混用时特别容易出错
比如在 printf 中传 long 却用 %d,或把 int 结果赋给 long long 后再做位运算——表面没报错,但可能截断或零扩展异常。
常见坑:
• printf("%d", (long)val) → 格式符和类型不匹配,UB(未定义行为)
• int x = INT_MAX; long long y = x → 先在 <code>int 内左移,溢出后才提升,结果不是预期的高位移位
• Windows 上 long 是 4 字节,Linux x86_64 上是 8 字节,混用 long 和 int 做接口参数极易二进制不兼容
需要可移植整数时,优先选 std::int32_t 这类定宽类型
int 的模糊性在协议解析、内存映射、序列化场景里会立刻暴露。这时候标准库提供的定宽整型就是明确契约。
使用前提:
• 包含 <cstdint></cstdint>
• std::int32_t 仅在平台支持 32 位补码有符号整型时定义(几乎所有现代平台都满足)
• 若不确定是否可用,用 std::int_least32_t(至少 32 位)或 std::int_fast32_t(最快且至少 32 位)
• 注意:这些是 typedef,不是新类型,sizeof(std::int32_t) 保证为 4
真正麻烦的从来不是“int 几个字节”,而是你默认它是某个值之后,在边界条件、格式化输出、跨平台 ABI、位操作中悄悄失效。每次看到裸 int,都该下意识问一句:这里到底需不需要精确宽度?










