风议员
回答者
回答于 2026-10-21
C++标准库没有直接将十进制整数转换为任意进制(如二进制、八进制、十六进制以外的进制)字符串的内置函数,需要通过算法手动实现。
实现步骤
- 处理特殊情况:若输入为0,直接返回字符串
"0"。 - 记录符号:判断是否为负数,若是则记录符号并将数值转为正数处理(注意使用无符号类型防止溢出)。
- 循环取余:将当前数值对目标进制
base取余,余数即为当前最低位的值。根据余数大小映射为对应字符(0-9映射为'0'-'9',10及以上映射为'A'、'B'等)。将数值除以base,重复此过程直到数值为0。 - 添加符号与反转:若原数为负,追加负号。由于取余得到的是从低位到高位的顺序,最后需要将字符串反转。
代码示例
#include <string>
#include <algorithm>
std::string toBaseString(long long value, int base) {
if (base < 2 || base > 36) return ""; // 限制常用进制范围
if (value == 0) return "0";
std::string result;
bool isNegative = value < 0;
unsigned long long num = isNegative ? -static_cast<unsigned long long>(value) : value;
const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
while (num > 0) {
result += digits[num % base];
num /= base;
}
if (isNegative) result += '-';
std::reverse(result.begin(), result.end());
return result;
}
适用条件
- 适用于2到36之间的进制转换(受限于数字加英文字母的字符数量)。
- 支持有符号整数的负数转换。
常见误区
- 忽略负数边界:对最小负数(如
LLONG_MIN)直接取绝对值会导致有符号整数溢出,应先转换为无符号类型再处理。 - 忘记反转字符串:取余法得到的字符顺序是逆序的,不反转会导致结果错误。
- 未处理零值:当输入为0时,循环不会执行,若不单独判断会返回空字符串。