Беззнаковое длинное длинное неверное заданное значение после добавления

У меня есть две строки, чтобы добавить. Строки это 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();

0

Решение

Вся беззнаковая арифметика в C (и C ++) происходит по модулю 2К для некоторых к. В вашем случае вы получаете результат по модулю 264, подразумевая, что unsigned long long — это 64 бита на вашей платформе.

Если вы хотите выполнять арифметику с целыми числами, большими, чем самый большой поддерживаемый тип на вашей платформе, вам нужно использовать библиотеку с несколькими точностями, например GMP

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]