不用数组实现十进制转十六进制代码出错:数值>1000时结果异常
问题分析与解决
核心错误
- 整数溢出:你复用输入变量
num存储转换后的ASCII码组合,且使用int类型。当输入数值较大时,num * 100 + temp会快速超出int的取值范围(32位int最大值为2147483647),导致溢出,出现错误结果。 - 输出格式错误:直接输出ASCII码数值(如'A'对应的65)而非转换为字符,不符合十六进制的预期输出格式。
- 边界情况未处理:输入为0时,循环不会执行,输出为空,正确结果应为"0"。
解决办法
- 改用更大范围的数值类型(如
unsigned long long)存储转换结果,避免溢出; - 将ASCII码值转换为字符后输出;
- 单独处理输入为0的特殊情况。
改进代码
方案1:使用unsigned long long扩展存储范围
#include <iostream> using namespace std; int main() { int num; cout << "Enter decimal number: "; cin >> num; if (num == 0) { cout << "Hexadecimal = 0\n"; return 0; } unsigned long long result = 0; int temp; // 计算每一位十六进制字符的ASCII值,存入result for (int i = num; i > 0; i /= 16) { temp = i % 16; temp = (temp < 10) ? temp + 48 : temp + 55; result = result * 100 + temp; } cout << "Hexadecimal = "; char ch; // 提取ASCII值并转为字符输出 for (unsigned long long j = result; j > 0; j /= 100) { ch = static_cast<char>(j % 100); cout << ch; } cout << "\n"; return 0; }
方案2:递归实现(无存储,彻底避免溢出)
递归方式先处理高位再输出,无需存储中间结果,完全消除溢出风险:
#include <iostream> using namespace std; void decToHex(int num) { if (num == 0) return; int temp = num % 16; decToHex(num / 16); cout << static_cast<char>(temp < 10 ? temp + 48 : temp + 55); } int main() { int num; cout << "Enter decimal number: "; cin >> num; cout << "Hexadecimal = "; num == 0 ? cout << "0" : decToHex(num); cout << "\n"; return 0; }
说明
- 方案1通过
unsigned long long大幅提升了可处理的数值范围,但仍受限于类型本身的最大值; - 方案2更简洁,无存储上限问题,能处理所有合法
int范围内的数值; - 两种方案都修复了输出格式问题,并覆盖了输入为0的边界情况。
内容的提问来源于stack exchange,提问作者Xeeshan_65
相关产品推荐
相关产品推荐

