应优先使用absl::int128处理128位整数需求,因其轻量、可靠、跨平台;超128位则选boost::multiprecision::cpp_int或libgmp;禁用__int128于公共接口,避免在索引等性能敏感场景使用任意精度类型。

直接换类型不现实——long long 已是标准整型上限,再往上没有内置类型;必须用库或自建方案,且得明确区分“需要精确计算”和“只需要更大范围但可接受近似”的场景。
std::int128_t 不是标准 C++ 类型
GCC/Clang 支持 __int128(非标准扩展),但 MSVC 完全不支持;即使可用,它也不能用于模板参数、std::vector 元素或跨平台 ABI。别把它当 portable 解法写进公共接口。
- 仅限 GCC/Clang 本地工具链,且需显式启用:编译时加
-fext-numeric-literals(部分版本) -
std::is_integral_v<__int128></__int128>为 true,但std::numeric_limits<__int128>::max()</__int128>未定义,不能依赖 - IO 操作需手动转字符串:
std::to_string不支持,得用std::ostringstream或 sprintf 风格格式化
absl::int128 是最轻量可靠的替代
Google 的 absl::int128 是目前事实标准:头文件-only、无依赖、API 接近原生整型、完整支持 + - * / %、比较、位运算,且已通过 fuzzing 验证边界行为。
- 安装后直接
#include "absl/numeric/int128.h",无需链接 - 构造安全:
absl::int128 x = absl::MakeInt128(0x1234567890123456, 0xabcdef0123456789); - 算术函数如
absl::int128_add返回absl::int128,不抛异常,溢出行为定义为回绕(与 unsigned 一致) - 注意:除法和取模在被除数为负时,结果符号与被除数一致(C++11 向前兼容语义)
真正超大数(>128 位)必须用任意精度库
一旦涉及密码学、高精度金融或数学推导,absl::int128 就不够了。此时应选 boost::multiprecision::cpp_int 或 libgmp 绑定,而非自己实现。
-
boost::multiprecision::cpp_int:头文件-only,支持动态位宽,可设为checked_cpp_int在溢出时抛std::overflow_error - 避免
cpp_dec_float处理整数——它是浮点模拟,精度和性能都不如整型专用实现 - 若已有 GMP 依赖,用
mpz_class更高效;但注意其 operator= 对字符串输入不做范围校验,mpz_set_str(..., 10)可能静默截断 - 所有任意精度类型都不适合做容器索引或
std::mapkey(性能差、哈希难),优先转为uint64_t哈希或用std::string表示
最易被忽略的一点:别在循环计数或数组下标里用任意精度整型。哪怕逻辑上“不会溢出”,cpp_int 的构造/比较开销也比 size_t 高 2–3 个数量级——这种地方该换算法或分块,而不是硬上大数。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











