Я пытаюсь преобразовать строку произвольной длины в int, но пока она работает только для строк ограниченной длины. Код до сих пор:
long long convertToInt (std::string x){
long long number;
std::istringstream ss(x);
ss >> number;
return number;}
за x=100000000000000000000000001
функция возвращает 0
, Может кто-нибудь объяснить, почему? Благодарю.
Встроенные целочисленные типы, предоставляемые вашим компилятором, гарантированно будут способны хранить числа определенной величины. Похоже, ваш номер больше этого. Вы можете обнаружить, что программа C ++ сообщает об ошибке — попробуйте …
if (ss >> number)
return number;
throw std::runtime_error("conversion of string to int failed");
…или любой другой обработки ошибок, которую вы чувствуете.
Если вы должны использовать большее число, вы можете попробовать double
или, если это не соответствует вашим потребностям, посмотрите библиотеки «произвольной точности», такие как GMP, — вы найдете множество вопросов о стекопереработке по обработке больших чисел с ответами, предлагающими, контрастирующими и иллюстрирующими GMP и альтернативы.
Значение "100000000000000000000000001"
является большим, чтобы вписаться в long long
(или же unsigned long long
), поэтому извлечение не удается.
использование numeric_limits
чтобы определить максимальное значение для типов в вашей реализации:
#include <limits>
std::cout << std::numeric_limits<unsigned long long>::max() << "\n";
std::cout << std::numeric_limits<long long>::max() << "\n";
std::cout << "100000000000000000000000001\n";
печатает:
18446744073709551615 9223372036854775807 100000000000000000000000001
Проверьте результат попытки извлечения, чтобы убедиться, что извлечение произошло:
if (ss >> number)
{
return number;
}
// Report failure.