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

C++ C++;十六进制到十进制的转换,c++,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++) { res

我目前遇到了一个问题,即使在调试时我似乎也不明白。我试图创建一个十六进制到十进制的转换程序,但遇到了一个无法解决的问题。每次我尝试输入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;
}
intpowerfunc(intx,inty)
{
无符号长整型结果=1;
int i;
对于(i=0;i
十六进制到十进制函数

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-hexToDec(字符串十六进制数)
{
int i;
int power=hexaNumber.length()-1;
int checkLength=hexaNumber.length();
无符号长整型小数结果=0;
对于(i=0;i='0'&&int(hexaNumber[i])='A'&&int(hexaNumber[i])='A'&&int(hexaNumber[i])让我们看看这一行:

       decimalResult += ((int(hexaNumber[i])) - 55) * powerFunc(16, power);
这里有乘法溢出。
((int(hexaNumber[i])-55)
的类型为
int
int
至少是从-32767到32768,但在32位系统上,
sizeof(int)=4
通常是从
-2147483648
2147483647
powerFunc(16,power)
int第一次迭代等于
(int)268435456
。现在对于
hexaNumber[i]='F'
,您正在执行
15*268435456
,即
4026531840
。int溢出,因为您在您的机器上包装了溢出,所以会得到
小数结果+=(int)-268435456
。但是
decimalResult
的类型为
无符号long-long
,因此该数字将转换为无符号
18446744073441116160
,因此在第一次循环迭代后
decimalResult=18446744073441116160

可能最简单的代码修复方法是将所有类型更改为
unsigned long
。这意味着
powerFunc
参数和返回类型(在
powerFunc
中将
result
从int转换为unsigned long long)和
hexToDec
返回值(
hexToDec
返回int,但返回
decimalResult
,它是
无符号长
,然后将值保存在
dec1
中,它是
无符号长
)。
好的解决方法是检查乘法溢出并处理这种情况,例如抛出一个异常,如抛出。

作为一个旁注,你可以删除所有的<代码> int(…)>代码>转换,你的代码也会运行相同。

这些代码> int()(代码)>转换,它们是否需要?你可以安全地删除它们,从而拥有更干净的代码。此外,C++标准库已经具有幂函数:<代码> STD::POW。
       decimalResult += ((int(hexaNumber[i])) - 55) * powerFunc(16, power);