Member 13899738 Ответов: 1

С++ шестнадцатеричных в десятичные конвертер


Приветствия,

В настоящее время я столкнулся с проблемой, которую, похоже, не понимаю даже во время отладки. Я пытаюсь создать программу преобразования шестнадцатеричных чисел в десятичные, но столкнулся с проблемой, которую не могу исправить. Каждый раз, когда я пытаюсь ввести 8Fs или выше для преобразования в десятичную дробь, это приводит к результату 16Fs (он же максимальный диапазон:18446744.... 615)

Это и есть код:
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

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;

	//Convert Hexa to Decimal for Number;

	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 Ответов

Рейтинг:
8

OriginalGriff

powerFunc возвращает значение int:

int powerFunc(int x, int y)
{
   ...
}
а 16^8-это 4,294,967,296 или в шестнадцатеричном формате 0x100000000 - что не вписывается в 32-битное целое число!