問題タブ [integer-overflow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++で符号なしintをintに変換する整数オーバーフローを回避する効率的な方法は何ですか?
以下は、C++ で unsigned int を int に変換する効率的で問題のない方法ですか?
それとももっと良い方法がありますか?
アップデート
James McNellis が指摘したように、unsigned int > INT_MAX を整数に割り当てることは未定義ではありません。むしろ、これは実装定義です。そのため、ここでのコンテキストは、unsigned int が INT_MAX を超えたときにこの整数がゼロにリセットされるようにすることを特に好みます。
元のコンテキスト
カウンターとして使用される unsigned int がいくつかありますが、特定のケースではそれらを整数として渡したいと考えています。
通常の操作では、これらのカウントは INT_MAX の範囲内にとどまります。ただし、異常な (しかし有効な) ケースが発生した場合に未定義の実装固有の動作に陥らないようにするために、ここで効率的な変換が必要です。
c - コード例の分析に関するフィードバック (セキュア コーディング)
よくわからない割り当てのコードがあります。私は答えを知っていると確信していますが、何か忘れた場合に備えてコミュニティに再確認したいだけです. タイトルは基本的に安全なコーディングで、質問は結果を説明するだけです。
私の推論は次のとおりです。
一見すると、コードが正の値に初期化され、増加し続けることを考えると、コードが永遠に実行されることが想像できます。最終的に値が大きくなりすぎて整数オーバーフローが発生するため、これはもちろん間違っています。これも完全に正しいわけではありません。最終的には変数 'i' が最後のビットを 1 にすることで強制的に署名され、負の数と見なされてループが終了するからです。したがって、割り当てられていないメモリへの書き込みではなく、整数オーバーフローが発生するのではなく、データ型に違反してループが終了します。
これが理由だと確信していますが、再確認したいだけです。ご意見はありますか?
java - これはJVMのバグですか、それとも「予想される動作」ですか?
予期しない動作(個人的な期待に比べて予期しない)に気づきました。JVMにバグがあるのか、それともこれが正確に何の詳細を理解していないフリンジケースなのか疑問に思います。起こることになっています。mainメソッド自体に次のコードがあるとします。
素朴な期待は、これが印刷されることInteger.MAX_VALUE-1
であり、最大でさえ表現可能int
です。ただし、Javaでは整数演算が「ロールオーバー」することになっていると思います。したがって、に1を追加するInteger.MAX_VALUE
と。になりInteger.MIN_VALUE
ます。Integer.MIN_VALUE
はまだより小さいので、Integer.MAX_VALUE
ループは負の偶数intを反復し続けます。最終的には0に戻り、このプロセスは無限ループとして繰り返されるはずです。
このコードを実際に実行すると、非決定論的な結果が得られます。印刷される結果は50万のオーダーになる傾向がありますが、正確な値は異なります。したがって、ループは無限ループであると私が信じるときに終了するだけでなく、ランダムに終了するように見えます。どうしたの?
私の推測では、これはJVMのバグであるか、この予想される動作を実現する多くのファンキーな最適化が行われていると思います。どっち?
java - Javaでの複合代入がオーバーフローの問題をキャッチしないのはなぜですか?
驚いたことに、次のコードは警告なしでコンパイルされることがわかりました。
予想どおり、これによりコンパイル時エラーが発生します。
私はそれを調べました、そして確かに、JLS(セクション15.26.2)はこれを言っています:
E1 op = E2の形式の複合代入式は、E1 =(T)((E1)op(E2))と同等です。ここで、TはE1のタイプですが、E1は1回だけ評価されます。
これは私にはばかげているようです。なぜ彼らはここで明示的にキャストする必要性を感じたのですか?とにかく自動型変換が拡大を処理したようであり、このように自動的に縮小すると、整数のオーバーフローが発生することがほぼ保証されます。
c++ - 2 つの文字を追加するときに整数オーバーフローが発生しないのはなぜですか?
重複の可能性:
2 つの文字を加算すると int が生成される
次の C++ コードがあるとします。
出力は論理的に予想される150ですが、式に整数オーバーフローがあるべきではありません(a + b)
か?
明らかに、ここでのオーバーフローに対処するために整数の昇格が必要です。そうでない場合、私には見えない何かが起こっています。誰かが私を啓発できるかどうか疑問に思っていたので、整数の昇格とオーバーフローに関して依存できるものと依存すべきでないものを知ることができます。
c# - WCFサービスでFireBirdSqlをホストするときのAccessViolationException
WCFサービスをマネージドWindowsサービスとしてホストしていますが、コンシューマー/クライアントが2回目、3回目、または4回目にメソッドを呼び出すと、AccessViolationExceptionが発生し続けます。クラッシュは完全にランダムであるため、後でさらに数回呼び出すまでクラッシュしない場合があります。
読みやすくするために構文が強調表示されたコードは次のとおりです。http://pastebin.com/Z3Z06944
プライベートメソッド「CheckUser」に関するコメントを参照してください。例外が発生している可能性があります。
java - Spring MVCで整数オーバーフローエラーをキャッチする方法は?
SpringMVC3.0.5を使用しています。Springは、整数にマップされているフィールドの整数オーバーフローを喜んで無視します。その上で適切なエラーを報告するにはどうすればよいですか?
c# - 永遠にインクリメントすると、-2147483648が得られますか?
私が本当に説明したくない巧妙で複雑な理由のために(それは非常に醜くてハッキーな方法でタイマーを作ることを含むので)、私は次のようなC#コードを書きました:
プログラムが永久にハングしたり、クラッシュしたりすることを期待していましたが、驚いたことに、約20秒待った後、次の出力が表示されます。
プログラミングは私に多くのことを教えてくれましたが、数を増やし続けると最終的に負になる理由をまだ理解できません...ここで何が起こっているのでしょうか?
matlab - Matlab int を C++ int のように動作させる方法はありますか?
最終的に C++ でコード化するものをシミュレートするのに役立つ Matlab ルーチンを作成しています。1 つの問題は、Matlab と C++ の int が、コンテナーが保持できるよりも大きな結果を生成する算術演算を実行するときに異なる動作をすることです。
たとえば、Matlabintmax('uint16')
では が生成され65535
ます。そしてintmax('uint16')+1
まだ生産してい65535
ます。65535 より高くしたい場合は、できません。Matlab は単にキャップをかぶせます。
C++ は異なります。書き込みは加算を完全に実行し、最下位 16 ビットを単純に保持するためunsigned short x = 65535; cout << ++x;
生成されます。0
Matlab を同じように動作させる方法はありますか?
java - 整数オーバーフローによって生成された間違った数値を修正するにはどうすればよいですか?
整数オーバーフローを引き起こすバグがあり、間違った (負の) タイムスタンプがデータベースに書き込まれました。コードは修正済みですが、間違ったデータも修正したいです。
間違った結果を取得して Integer.MAX_VALUE を追加することもできると思いましたが、うまくいかないようで、高い値が残っていました。以下のコード スニペットにoffset
値がありますが、入力値は保存されません。
次のコードはバグを再現します。