为什么会cin
失败,当我输入如下数字时: 3999999999 但它适用于较小的数字,如: 5 ?
#include <iostream>
int main()
{
int n;
std::cin >> n;
if (std::cin.fail())
std::cout << "Something sucks!";
else
std::cout << n;
return 0;
}
尝试:
std::cout << std::numeric_limits<int>::max() << std::endl; // requires you to #include <limits>
int
在您的系统上可能是一个 32 位有符号二进制补码,这意味着它可以表示的最大值是 2,147,483,647。您的数字 3,999,999,999 大于该数字,无法正确表示为int
。cin
失败,提醒您问题。
long
可能是您系统上的 64 位整数,如果是,请尝试。您需要一个 64 位整数来表示 3,999,999,999。或者,您可以使用unsigned int
,它可以表示大至 4,294,967,295 的数字(同样,在典型系统上)。当然,这意味着你不能代表负数,所以这是一个权衡。
当格式化的输入函数以某种形式失败时,它们会设置std::ios_base::failbit
并保持参数中的原始值不变。有不同的故障,溢出被认为是一种故障。我记得关于以不同方式指示不同错误的讨论,但我不记得结果。最好的办法是确保errno
在调用任何输入函数之前清除它并检查errno
以ERANGE
区分溢出和格式错误。
这可能是因为 big 值太大而无法放入int
系统上的类型变量中。尝试将大值分配给您的变量,看看会发生什么。
要修复它,请将变量的类型更改为更广泛的类型,例如long
or long long
。
an 可表示的最大数int
取决于它所表示的位数。通常,它是 32 位的,即。最大数字是2147483647
,小于您输入的数字。