我目前遇到了一个问题,即使在调试时也似乎无法理解。我正在尝试创建一个十六进制到十进制的转换器程序,但是遇到了无法解决的问题。每次我尝试输入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。 我该怎么做才能解决这个问题?预先感谢。
答案 0 :(得分:0)
让我们看看这一行:
decimalResult += ((int(hexaNumber[i])) - 55) * powerFunc(16, power);
您在这里遇到乘法溢出。 ((int(hexaNumber[i])) - 55)
的类型为int
。 int
至少 从-32767到32768,但在sizeof(int) = 4
的32位系统上,通常是从-2147483648
到2147483647
。 powerFunc(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
转换,并且代码将以相同的方式运行。