You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不用数组实现十进制转十六进制代码出错:数值>1000时结果异常

问题分析与解决

核心错误

  1. 整数溢出:你复用输入变量num存储转换后的ASCII码组合,且使用int类型。当输入数值较大时,num * 100 + temp会快速超出int的取值范围(32位int最大值为2147483647),导致溢出,出现错误结果。
  2. 输出格式错误:直接输出ASCII码数值(如'A'对应的65)而非转换为字符,不符合十六进制的预期输出格式。
  3. 边界情况未处理:输入为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:10:28