c++oding="utf-8" ?>
std::to_string 是最直接的 long 转 string 方式,要求变量为有符号 long 类型且注意跨平台 long 位宽差异;ostringstream 更灵活但需每次清空内容和状态位。

std::to_string 是最直接的转换方式
只要编译器支持 C++11 或更高版本,std::to_string 就能安全、简洁地把 long 转成 std::string。它对有符号整数类型(包括 long)做了重载,内部处理了符号和进制,无需手动格式化。
常见错误是误传浮点数或指针——std::to_string 不接受 long long(需用 std::to_string 的 long long 重载,但某些旧标准库实现可能缺失),也不接受 unsigned long(会触发隐式转换为 long,若值超出 long 表示范围则行为未定义)。
- 确保变量确实是带符号的
long类型,例如:long x = 123456789L; - 调用时直接传入:
std::string s = std::to_string(x); - 注意:在 Windows MSVC 下,
long是 32 位;Linux/macOS GCC/Clang 中通常是 64 位——如果跨平台且值可能超 2³¹−1,建议显式用int64_t+std::to_string避免歧义
用 std::ostringstream 需要额外注意流状态
当需要控制格式(比如补零、指定进制)或批量拼接时,std::ostringstream 更灵活,但它不是“一调就完”的函数,容易因残留状态导致后续转换出错。
典型问题:连续多次使用同一个 std::ostringstream 对象,第二次转换结果为空或异常——这是因为第一次操作可能设置了 failbit(如写入失败)或 eofbit,而没清空状态位。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 每次使用前应调用
oss.str("")清空内容,并用oss.clear()重置状态标志 - 基础写法:
std::ostringstream oss; oss - 若要转十六进制:
oss ,但注意这会影响后续所有整数输出,建议单独声明或用 <code>std::ios_base::fmtflags保存/恢复格式
避免 sprintf / snprintf 的安全隐患
用 C 风格函数(如 sprintf)转 long 很容易踩缓冲区溢出或格式符不匹配的坑。比如在 64 位系统上用 %d 打印 long(实际是 64 位),会导致截断或崩溃。
即使改用 snprintf,也必须选对格式符:long 对应 %ld,unsigned long 是 %lu,long long 是 %lld——漏掉 l 或大小写错,就是未定义行为。
- 不要手算缓冲区长度,
snprintf返回值是所需字节数(不含\0),可先调一次获取长度再分配内存 - 更推荐用
std::to_string替代,除非你明确需要 C 兼容或极致性能(且已确认瓶颈在此) - 绝对不要用
sprintf(buf, "%ld", x)而不检查buf大小——long最多需约 20 字节(含符号和终止符),但硬编码char buf[32]仍属脆弱设计
long long 和 unsigned long 的转换不能混用 to_string
std::to_string 没有为 unsigned long 提供独立重载,传入时会隐式转为 long。一旦值 ≥ 2³¹(32 位 long)或 ≥ 2⁶³(64 位 long),结果就不是原值——而是负数或截断值。
同样,long long 在部分旧 libstdc++ 版本中不被 std::to_string 支持,编译会报错。
- 对
unsigned long,优先用std::to_string(static_cast<unsigned long>(x))</unsigned>,再配合std::to_string的unsigned long long重载(C++11 起保证存在) - 对
long long,直接用std::to_string(x)(前提是编译器和标准库支持该重载);否则退回到std::ostringstream - 不确定类型宽度时,用
int64_t/uint64_t显式替代,再调std::to_string,语义清晰且可移植
真正容易被忽略的是类型宽度与平台的耦合——同一行 std::to_string(x) 在 Windows 和 Linux 上可能处理不同位宽的 long,而编译器不会报错。如果逻辑依赖数值范围(比如 ID 生成、位运算后转字符串),务必查清目标平台的 sizeof(long),必要时用固定宽度整型替代。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










