我正在尝试将任意长度的字符串转换为 int,但到目前为止它仅适用于长度有限的字符串。到目前为止的代码:
long long convertToInt (std::string x){
long long number;
std::istringstream ss(x);
ss >> number;
return number;}
对于x=100000000000000000000000001
函数返回0
。有人可以解释为什么吗?谢谢。
我正在尝试将任意长度的字符串转换为 int,但到目前为止它仅适用于长度有限的字符串。到目前为止的代码:
long long convertToInt (std::string x){
long long number;
std::istringstream ss(x);
ss >> number;
return number;}
对于x=100000000000000000000000001
函数返回0
。有人可以解释为什么吗?谢谢。
该值"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.
您的编译器提供的内置整数类型仅保证能够存储特定数量级的数字。看起来你的号码比那个大。您可能会发现 C++ 程序正在报告错误 - 尝试...
if (ss >> number)
return number;
throw std::runtime_error("conversion of string to int failed");
...或您喜欢的任何其他错误处理。
如果您必须使用更大的数字,您可以尝试double
,或者如果这不适合您的需要,请查看“任意精度”库,如 GMP - 您会发现很多关于处理大数字的 stackoverflow 问题,并提供建议、对比和说明的答案GMP 和替代品。