应根据实际数值范围、跨平台需求和溢出风险选择:int适用于±21亿内场景;超2147483647时用long long或更稳妥的int64_t;注意输入输出格式匹配与缓存/兼容性影响。

选 int 还是 long long,不取决于“哪个更新”或“哪个看起来更大”,而取决于你**实际要存的数有多大、是否跨平台、有没有溢出风险**。绝大多数场景下,int 就够用;只有明确需要超过 ±21 亿时,才该切到 long long。
什么时候必须用 long long
不是“可能大”,而是“确定会超 int 最大值 2147483647”——比如:
- 文件大小(Linux
stat.st_size返回off_t,64 位系统常为 8 字节) - 时间戳(如
std::chrono::system_clock::now().time_since_epoch().count()在纳秒级下轻易破 10¹⁸) - 大数组索引(当元素总数 > 2³¹,例如处理 >2GB 的连续内存块)
- 算法中间结果(如两个
int相乘:200000 × 200000 = 40e9,已超int范围)
注意:long long 常量必须带后缀 LL 或 ll,否则编译器可能按 int 解析并截断——123456789012345 不加后缀,在某些编译器下会被当成溢出常量报错。
为什么不能无脑换 long long
long long 占 8 字节,int 占 4 字节,这不只是“多占点内存”的问题:
- 缓存行(cache line)利用率下降:同样大小的数组,
long long版本能装的数据项少一半,CPU 缓存命中率可能明显降低 - 运算开销略高:在部分老旧或嵌入式架构上,64 位整数运算周期比 32 位多
- 接口兼容性风险:比如调用系统 API(如
write()的size_t参数),传long long可能触发隐式截断警告甚至行为异常
更隐蔽的问题是:用 long long 存小数(比如循环计数从 0 到 1000),会让后续维护者误以为“这里数值很大”,反而掩盖真实意图。
跨平台开发时别信 long,但也不要直接跳 long long
long 在 Windows(MSVC/MinGW)下是 4 字节,和 int 一样;在 Linux/macOS(GCC/Clang)下是 8 字节——这种分裂让 long 成为跨平台陷阱。但 long long 并非万能解:
- 它只保证“至少 64 位”,标准没禁止实现为 128 位(极少见,但理论上存在)
- 真正需要可移植性的场合,应优先考虑
int64_t(来自<cstdint></cstdint>),它明确定义为有符号 64 位整数,且缺失时编译失败,不给你侥幸空间 - 若变量语义是“容器大小”,用
size_t更准确;若是“带符号偏移量”,ptrdiff_t比long long更贴切
简单说:long long 是“我确实需要大范围有符号整数”的务实选择;int64_t 是“我要求精确宽度且不容妥协”的工程选择。
一个容易被忽略的边界点:输入解析与格式化
用 scanf 或 std::cin 读整数时,类型选错会导致静默截断:
-
scanf("%d", &x)配long long x→ 未定义行为(写越界) -
scanf("%lld", &x)配int x→ 同样越界 -
std::stoi("123456789012345")返回int,直接溢出抛std::out_of_range
对应地,输出也得匹配:printf("%lld", x) 不能用于 int;C++20 起推荐用 std::format,但也要注意模板推导是否如你所想——std::format("{}", x) 对 long long 和 int 输出格式一致,但底层类型仍影响编译期检查和重载选择。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











