C ++十六进制到十进制转换

时间:2018-07-14 07:58:22

标签: c++

我目前遇到了一个问题,即使在调试时也似乎无法理解。我正在尝试创建一个十六进制到十进制的转换器程序,但是遇到了无法解决的问题。每次我尝试输入8Fs或更高的值转换为十进制数时,最终都会给出16Fs的结果(即最大范围:18446744 .... 615)

幂函数

int powerFunc(int x, int y)
{
    unsigned long long int result = 1;
    int i;

    for (i = 0; i < y; i++)
    {
        result *= x;
    }

    return result;
}

十六进制至十进制功能

int hexToDec(string hexaNumber)
{
    int i;
    int power = hexaNumber.length() - 1;
    int checkLength = hexaNumber.length();
    unsigned long long int decimalResult = 0;

    for (i = 0; i < checkLength; i++) {
        if (int(hexaNumber[i]) >= '0' && int(hexaNumber[i]) <= '9') { // check if FirstHexaNumber 0 to 9
            decimalResult += ((int(hexaNumber[i])) - 48) * powerFunc(16, power); //formula to convert hexadecimal into decimal, int(FirstHexaNumber[i]) is used to convert hexa into a number
        }
        else if (int(hexaNumber[i]) >= 'A' && int(hexaNumber[i]) <= 'F') // check if FirstHexaNumber is A to F
        {
            decimalResult += ((int(hexaNumber[i])) - 55) * powerFunc(16, power);
        }
        else if (int(hexaNumber[i]) >= 'a' && int(hexaNumber[i]) <= 'f') // check if FirstHexaNumber is a to f
        {
            decimalResult += ((int(hexaNumber[i])) - 87) * powerFunc(16, power);
        }
        power--; //power-- since it starts from "HexaNumber.length - 1". Power should decrease as assignment of power goes down
    }

    return decimalResult;
}

主要

int main()
{
    unsigned long long int result;
    unsigned long long int dec1;
    unsigned long long int dec2;
    unsigned long long int totalDec;
    string hexa1;

    string FirstHexaNumber;

    getline(cin, FirstHexaNumber);

    dec1 = hexToDec(FirstHexaNumber);

    cout << dec1 << endl;


    return 0;
}

我尝试调试问题,幂函数运行正常,它设法获得应有的结果。在这种情况下,当我输入“ FFFFFFFF”时,得到的功率为268435456,这是正确的。

但是,当涉及到转换部分时,它就混乱了。由于某种原因,在公式的for循环的第一次运行中,(int(F)-55)* 16 ^ 8 =最终得到18446744 .... 615。 我该怎么做才能解决这个问题?预先感谢。

1 个答案:

答案 0 :(得分:0)

让我们看看这一行:

       decimalResult += ((int(hexaNumber[i])) - 55) * powerFunc(16, power);

您在这里遇到乘法溢出。 ((int(hexaNumber[i])) - 55)的类型为intint至少 从-32767到32768,但在sizeof(int) = 4的32位系统上,通常是从-21474836482147483647powerFunc(16, power) int第一次迭代等于(int)268435456。现在,对于hexaNumber[i] = 'F',您正在执行15 * 268435456的{​​{1}}。 int溢出,并且因为您在计算机上包装了溢出,所以得到4026531840。但是decimalResult += (int)-268435456的类型为decimalResult,因此此数字将转换为无符号的unsigned long long,因此在第一次循环迭代18446744073441116160之后。
您的代码最简单的解决方法可能是将所有类型都更改为decimalResult = 18446744073441116160。这意味着unsigned long long个参数和返回类型(您将powerFunc中的result从int转换为unsigned long long)和powerFunc返回值(hexToDec返回int您返回hexToDec的{​​{1}},然后将值保存在decimalResult的{​​{1}}中。
好的解决方法是检查乘法溢出并处理这种情况,例如,抛出一个异常,例如stoi抛出out_of_range
附带说明,您可以删除所有unsigned long long转换,并且代码将以相同的方式运行。