std::to_string(long)是首选,因它轻量安全、无内存泄漏、自动保留符号、支持极大值且性能优于ostringstream;不支持进制定制等场景需换用stringstream或format。

直接用 std::to_string 就行,它原生支持 long(以及 long long、int 等整型和浮点类型),无需额外头文件(C++11 起已内置在 <string></string> 中)。
为什么 std::to_string(long) 是首选
它是标准库提供的最轻量、最安全的转换方式,底层调用优化过的字符串格式化逻辑,不依赖 C 风格函数或流操作,无内存泄漏风险,也不需要手动管理缓冲区。
-
long值会被无损转为十进制字符串,符号位自动保留(如-123L→"-123") - 不支持自定义进制(比如转十六进制必须换其他方法)
- 对极大值(如
LONG_MAX)也稳定,不会因缓冲区溢出崩溃 - 性能优于
std::ostringstream,尤其在高频调用场景
std::to_string 不支持的场景怎么办
当需要十六进制、八进制、带前导零、科学计数法或 locale 感知格式时,std::to_string 无法满足,得换方案:
- 进制转换:用
std::stringstream配合std::hex/std::oct,或 C++17 的std::format(如std::format("{:x}", x)) - 固定宽度:用
std::setfill+std::setw(配合 stringstream),或std::format("{:08x}", x) - locale 格式(如千分位逗号):只能用
std::ostringstream并 imbue 对应 locale - 极简嵌入式环境(无 STL):退回到
snprintf,但需预估缓冲区大小(如char buf[32])
常见错误:误用 std::to_wstring 或 std::to_string(float)
std::to_wstring 返回的是 std::wstring(宽字符),不是 std::string,混用会导致编译失败或隐式转换意外截断;而 std::to_string 接收 float 或 double 时默认只保留 6 位有效数字,容易丢失精度——这不是 bug,是标准规定的行为。
立即学习“C++免费学习笔记(深入)”;
- 要避免宽窄混淆:确认目标类型是
std::string再调用std::to_string - 浮点数需更高精度:改用
std::stringstream或std::format控制小数位数(如"{:.10f}") - 别对
long long用旧式ltoa:它非标准,Windows-only,且参数顺序易错(目标 buffer 在前)
真正要注意的其实是边界情况:比如 long 在不同平台可能是 32 位或 64 位,但 std::to_string 全部兼容;唯一容易被忽略的是——它不抛异常,也不会告诉你转换失败,因为整型到字符串根本不存在“失败”语义。只要值合法,结果就确定。











