2015-11-25 13 views
0

У меня есть две строки для добавления. Строки - это значения HEX. Я конвертирую строки в long long, добавляю и возвращаюсь в строку. Но эта операция не работает.Unsigned 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(); 
+1

У вас есть простой случай переполнения здесь. Эти numvers не соответствуют 64-битным целым числам. – SergeyA

+0

@SergeyA хорошо. Я думаю, что это моя ошибка. Спасибо. – ventaquil

ответ

2

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

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

+0

Спасибо, Крис. Я думаю, что это моя ошибка. Спасибо :) – ventaquil

 Смежные вопросы

  • Нет связанных вопросов^_^