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