std::to_string最简单但需注意编译器兼容性,c++11起支持long long重载,msvc 2013及更早不支持;std::ostringstream更通用,适合补零、进制转换等复杂格式控制。

用 std::to_string 最简单,但要注意编译器和标准版本
直接调用 std::to_string 是最常用也最安全的方式,C++11 起就支持 long long 重载:
long long x = 123456789012345LL; std::string s = std::to_string(x); // ✅ 正确
但要注意:MSVC 2013 及更早版本不支持 long long 版本的 std::to_string;GCC 4.8+、Clang 3.4+ 均支持。如果项目需兼容旧编译器,得换方案。
用 std::ostringstream 更通用,适合复杂格式控制
当需要补零、进制转换(如十六进制)、或与其它类型拼接时,std::ostringstream 更灵活:
long long x = -9876543210LL; std::ostringstream oss; oss <p>常见变体:</p>
oss → 小写十六进制(无前缀)oss → 补零到 16 位oss 显式切回十进制(避免流状态污染)
注意:流对象有状态(如 std::hex 会持续生效),跨多次使用前建议 oss.str("") 清空内容,并用 oss.clear() 重置错误标志。
用 sprintf / snprintf 性能高但要手动管理缓冲区
对性能敏感且确定数值范围时,C 风格函数更快,但必须预留足够空间:
long long x = 9223372036854775807LL; // INT64_MAX char buf[32]; // 20 位数字 + 符号 + \0,32 安全 snprintf(buf, sizeof(buf), "%lld", x); // ✅ 推荐用 snprintf 防溢出 std::string s(buf);
关键点:
- 格式符必须是
"%lld"(Linux/macOS)或"%I64d"(旧 MSVC),现代 MSVC 也支持"%lld" -
sprintf不检查缓冲区大小,极易导致溢出;snprintf是唯一安全选择 - 负数会自动带
-,无需额外判断
别用 std::to_wstring 直接转 string,编码陷阱多
std::to_wstring(x) 返回 std::wstring,不是 std::string。强行用 .c_str() 强转或构造会导致乱码(尤其 Windows 上 wchar_t 是 UTF-16,char 通常是 Latin-1 或 UTF-8):
// ❌ 危险示例(平台相关,通常错) std::string s(std::to_wstring(x).c_str()); // 可能截断或乱码
真要处理宽字符,应显式用 std::wstring_convert(C++11–17)或 std::codecvt_utf8,但纯数字场景完全没必要——绕远路还易出错。
真正容易被忽略的是:不同标准库实现对 std::to_string 的异常行为不一致(比如某些嵌入式 STL 在输入为 LLONG_MIN 时可能崩溃),生产环境若涉及极端值,建议加一层 try/catch 或改用 snprintf。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











