3

cin3999999999のような数字を入力すると失敗するのはなぜですか?5のような小さい数字では機能しますか?

#include <iostream>

int main()
{
    int n;
    std::cin >> n;
    if (std::cin.fail())
        std::cout << "Something sucks!";
    else  
        std::cout << n;

    return 0;
}
4

4 に答える 4

6

試す:

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 はそれよりも大きく、 では適切に表すことができませんintcin失敗し、問題を警告します。

longシステムでは 64 ビット整数である可能性があります。そうである場合は、それを試してください。3,999,999,999 を再設定するには、64 ビット整数が必要です。または、 を使用することもできますunsigned int。これは、4,294,967,295 までの数値を表すことができます (これも一般的なシステムで)。もちろん、これは負の数を表すことができないことを意味するため、トレードオフになります。

于 2012-11-20T14:13:52.300 に答える
0

フォーマットされた入力関数がなんらかの形で失敗するstd::ios_base::failbitと、元の値を引数に設定して変更せずに残します。さまざまな失敗があり、オーバーフローは一種の失敗と見なされます。さまざまなエラーがさまざまな方法で示されているという議論を思い出しましたが、結果は思い出せません。最適errnoな方法は、入力関数を呼び出す前に がクリアされていることを確認し、オーバーフローとフォーマット エラーを区別するerrnoためにチェックすることです。ERANGE

于 2012-11-20T14:19:50.320 に答える
0

これはおそらく、大きな値が大きすぎintて、システムの型の変数に収まらないためです。変数に大きな値を割り当ててみて、何が起こるか見てみましょう。

longこれを修正するには、変数の型をorのようなより広い型に変更しますlong long

于 2012-11-20T14:14:01.987 に答える
0

で表現できる最大数は、表現されるintビット数によって異なります。通常、それは 32 ビットです。最大数は です2147483647。これは、入力した数よりも小さいです。

于 2012-11-20T14:14:08.083 に答える