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 の補数である可能性があります。つまり、表現できる最大値は 2,147,483,647 です。あなたの数字 3,999,999,999 はそれよりも大きく、 では適切に表すことができませんint
。cin
失敗し、問題を警告します。
long
システムでは 64 ビット整数である可能性があります。そうである場合は、それを試してください。3,999,999,999 を再設定するには、64 ビット整数が必要です。または、 を使用することもできますunsigned int
。これは、4,294,967,295 までの数値を表すことができます (これも一般的なシステムで)。もちろん、これは負の数を表すことができないことを意味するため、トレードオフになります。
フォーマットされた入力関数がなんらかの形で失敗するstd::ios_base::failbit
と、元の値を引数に設定して変更せずに残します。さまざまな失敗があり、オーバーフローは一種の失敗と見なされます。さまざまなエラーがさまざまな方法で示されているという議論を思い出しましたが、結果は思い出せません。最適errno
な方法は、入力関数を呼び出す前に がクリアされていることを確認し、オーバーフローとフォーマット エラーを区別するerrno
ためにチェックすることです。ERANGE
これはおそらく、大きな値が大きすぎint
て、システムの型の変数に収まらないためです。変数に大きな値を割り当ててみて、何が起こるか見てみましょう。
long
これを修正するには、変数の型をorのようなより広い型に変更しますlong long
。
で表現できる最大数は、表現されるint
ビット数によって異なります。通常、それは 32 ビットです。最大数は です2147483647
。これは、入力した数よりも小さいです。