У меня есть две строки, чтобы добавить. Строки это HEX значения. Я конвертирую строки в long long, добавляю и после того, как возвращаюсь к строке Но эта операция не работает хорошо.
Код:
unsigned long long FirstNum = std::strtoull(FirstString.c_str(), NULL, 16);
unsigned long long SecondNum = std::strtoull(SecondString.c_str(), NULL, 16);
unsigned long long Num = FirstNum + SecondNum;
std::cout << " " << FirstNum << "\n+ " << SecondNum << "\n= " << Num << "\n\n";
я получил
13285923899203179534
+ 8063907133566997305
= 2903086959060625223
Кто-нибудь может объяснить мне эту магию? Как я могу это исправить?
Вернуться к шестнадцатеричному значению
std::stringstream Stream;
Stream << std::hex << Num;
return Stream.str();
Вся беззнаковая арифметика в C (и C ++) происходит по модулю 2К для некоторых к. В вашем случае вы получаете результат по модулю 264, подразумевая, что unsigned long long — это 64 бита на вашей платформе.
Если вы хотите выполнять арифметику с целыми числами, большими, чем самый большой поддерживаемый тип на вашей платформе, вам нужно использовать библиотеку с несколькими точностями, например GMP
Других решений пока нет …