std::to_string 不能直接转八进制字符串,因其仅支持十进制转换;推荐用 std::ostringstream 配合 std::oct,如 int x = 0123; std::ostringstream oss; oss << std::oct << x;

用 std::to_string 不能直接转8进制字符串
std::to_string 只支持十进制转换,传入 0123(八进制字面量)也会被编译器先转成十进制整数再转字符串,结果是 "83" 而不是 "123"。这不是 bug,是设计如此——它不接受进制参数。
推荐用 std::ostringstream 配合 std::oct
这是最直观、可读性好且无依赖的方案:
int x = 0123; // 八进制字面量,值为 83 std::ostringstream oss; oss << std::oct << x; std::string s = oss.str(); // s == "123"
- 注意:
std::oct是流操纵器,只影响后续整数输出,不会改变x的值 - 如果
x是负数,std::oct仍会输出带负号的八进制(如-123→"-173"),符合预期 - 不带前导
"0";需要的话得手动拼接:"0" + s
用 std::format(C++20)更简洁
C++20 引入的 std::format 支持格式化说明符,一行搞定:
int x = 0123;
std::string s = std::format("{:o}", x); // s == "123"
-
"{:o}"表示无符号八进制;对有符号整数也适用,负号会前置 - 若需固定宽度或前导零,可用
"{:04o}"(输出"0123") - 注意:GCC 13+、Clang 15+、MSVC 19.32+ 才完整支持
std::format,旧编译器会编译失败
手写转换要注意整数边界和零值
自己实现时别直接除 8 循环取余——容易漏掉 0 或符号处理出错:
立即学习“C++免费学习笔记(深入)”;
- 输入为
0时,循环体一次都不执行,必须单独判断返回"0" - 负数建议先存符号、再对绝对值计算,避免
-8 % 8 == 0但-9 % 8 == -1这种平台相关行为 - 用
unsigned int做中间变量更安全,尤其处理INT_MIN时
真正需要手写的场景极少,除非在裸机或极简环境里连 iostream 都不可用。


















