2016-04-13 19 views
-1

私の計算では、境界に長い長い定数があります。数字が「misspreted」であるためにいくつかの条件が有効でないため、私はうまく動作しません 最初の出力は使用する数字です....出力では - 記号が削除されていることがわかりますあなたが見ることができるようにアンダーフローが、ときに私は0を追加し、その数はさらに高くなって、出力が正しい....C++ Visual Studio符号付き整数の振る舞い

について私はで、Visual Studioの2012

cout<<-2147483648<<endl; 
cout<<-2147483649<<endl; 
cout<<-21474836480<<endl; 
cout<<-21474836490<<endl; 
cout<<-214748364800<<endl; 
cout<<-214748364900<<endl; 

を使用しています最初の2行の符号が削除されます。

2147483648 
2147483647 
-21474836480 
-21474836490 
-214748364800 
-214748364900 

どんなアイデアでも問題は何ですか?

+0

https://en.wikipedia.org/wiki/Integer_overflow – Boiethios

+0

あなたの例でも、VS2012でコンパイルされません。 。次の2行のエラーメッセージで失敗します。「エラーC4146:単項マイナス演算子が符号なしタイプに適用され、結果が未署名です」。 –

答えて

1

コンパイラがあなたに与える警告メッセージを慎重に調べる必要があります。コードで警告が生成されない場合は、コンパイラの警告生成レベルを上げる必要があります。 、単項マイナス演算子は符号なしの型に適用されるよう まだ符号なし

基本的であることを意味し

、そのコンパイラます脅威最初の2つの値を結果:

警告C4146:MSVCコンパイラのこのコードは、2つの警告が生成されますunsigned intを入力し、単項マイナス演算子に適用します。この問題を解決するには、暗黙的に値の型を宣言する必要があります。

cout << -(long long)2147483649 << endl; 
+0

thx alot!私は長い長いテスト= - (長いlong)2147483648 – user2071938

+1

の接尾辞はおそらく(キャストの代わりに)行く方法です、あなたが最近のコンパイラを使用している場合は、単に行うことができます: 'auto値= -214748364900LL; ' – Pixelchemist

2

コンパイラの警告は無視してはいけません!

整数リテラルには接尾辞を付けないので、コンパイラはINT_MAXとUINT_MAXの間の値にはINT_MAX未満の値にはintを使用し、値にはunsigned intを使用します。 2の補数の32ビットプラットフォームであると仮定すると、INT_MAXは2147483647なので、2147483648と2147483648は符号なしであり、警告によって示されるように、符号なしタイプにマイナス符号を適用すると、正の値が得られます。結果はオーバーフローによるものです。

正しい方法はlong longためlongとLL用Lとlitteralを接尾辞にもある:

cout<<-2147483648LL<<endl; 
cout<<-2147483649LL<<endl; 
cout<<-21474836480LL<<endl; 
cout<<-21474836490LL<<endl; 
cout<<-214748364800LL<<endl; 
cout<<-214748364900LL<<endl; 
関連する問題