問題タブ [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.
delphi - メンバーのカウントに符号なし整数を使用する必要がありますか?
カウント クラス メンバーに符号なし整数を使用する必要がありますか?
答え
たとえば、クラスを想定します
それは理にかなっていますね。リストに格納されるアイテムの数を負にすることはできないので、符号なし整数型を使用しないのはなぜですか? 一般的には、可能な限り一般的でない (つまり、最も特殊な) 型を常に使用するのが良い原則だと思います。
リストを反復処理すると、次のようになります。
リストに格納されているアイテムの数が 0 の場合、コンパイラは次の評価を試みます。
これにより、適切な整数オーバーフロー (正確にはアンダーフロー) が発生します。デバッガーが例外が発生した適切な場所を表示しないという事実と相まって、これを見つけるのは非常に困難でした。
オーバーフロー チェックをオフにすると、結果として生じるエラーを追跡するのがさらに難しくなります。これは、自分のものではないメモリにアクセスすることが多くなり、未定義の動作が発生するためです。
このような状況を避けるために、今後はすべてのカウント メンバーにプレーンな整数を使用します。
それが完全にナンセンスである場合は、私に指摘してください:)
(コード内の整数オーバーフローを追跡するのに 1 時間費やしたので、それを共有することにしました。もちろん、ここにいるほとんどの人はそれを知っているでしょうが、おそらく誰かの時間を節約できるでしょう。)
c - オーバーフロー イン c
私は疑問を持っています
2 つの 16 ビット値を最大値で加算すると、16 ビット マシンでオーバーフローが発生しますか?
詳しく説明します
16 ビット プロセッサについて言えば、アキュムレータは 16 ビット サイズになります。上記のステートメントでオーバーフローが発生しますか? どうか明らかにしてください。
.net - .net Int64 が Int32 のように動作するのはなぜですか?
.net プログラムで奇妙な動作を目撃しています:
Int64.MaxValue は 64 ビットを使用していることを確認しているように見えますが、Int64 が Int32 のように動作するのはなぜですか?
関連する場合、私は 32 ビット OS を使用しており、ターゲット プラットフォームは「すべての CPU」に設定されています。
c++ - 安全な整数キャスト用のC++テンプレート
異なる整数型、異なる幅、および可能性のある符号付き/符号なしの不一致間のキャストで整数オーバーフローのランタイム例外をスローするC++テンプレート関数を作成しようとしています。これらの目的のために、私は浮動小数点型から整数型へのキャストや、その他のオブジェクトからオブジェクトへの変換には関心がありません。特別な場合のコードをたくさん書かなくても、これを実行したいと思います。これは私が現在持っているものです:
これは正しく効率的ですか?
編集:さまざまな理由でstlが利用できないため、std :: neuro_limitsを使用できず、Boostのすべてがすぐに使用できます。
c# - なぜこれはオーバーフローしないのですか?
このコードを考えると:
そして、int が -32,768 から +32,767 を保持できることを知っています。これがオーバーフローを引き起こさないのはなぜですか?
c - コンパイラ警告を使用して、定数 1 の左シフトのオーバーフローをキャッチしますか?
私たちは Linux カーネル内でコードを書いているので、できる限り試してみましたが、PC-Lint/Flexelint を Linux カーネル コードで動作させることができませんでした。組み込みシンボルなどが多すぎます。しかし、それは副次的な問題です。
gcc から始めて、さまざまなコンパイラがありますが、その他のコンパイラもあります。彼らの警告オプションは時間の経過とともに強化されており、かなり強力な静的分析ツールでもあります.
捕まえたいのはこちら。はい、「マジック ナンバーがない」、「ビット シフトに注意する」など、コード レビューで見つけやすいいくつかの点に違反していることはわかっていますが、それはたまたまコードのそのセクションを見た場合に限られます。とにかく、ここにあります:
さらに更新された問題の説明 - バーが 16 に制限されていても、まだ問題があります。明確にすると、問題は暗黙的な int 型の定数であり、計画外に、すべての計算が同じサイズと符号で実行されるという規則に違反する複雑な式になります。
問題: '1' は long long ではありませんが、小さな値の定数として、デフォルトで int になります。したがって、bar の実際の値がたとえば 16 を超えない場合でも、(1<<bar)
式はオーバーフローし、計算全体が台無しになります。
おそらく正しい解決策: 代わりに 1ULL を書き込みます。
この (改訂された) 問題を指摘するよく知られたコンパイラとコンパイラの警告フラグはありますか?
c - Cで2つの符号付き32ビット数を減算するときにオーバーフローを検出するにはどうすればよいですか?
2つの符号付き整数があり、それらを減算したいと思います。オーバーフローしたかどうかを知る必要があります。
そんな感じ。これを行う良い方法はありますか?
java - Javaで2つの数値を乗算するとオーバーフローが発生するかどうかを確認するにはどうすればよいですか?
2つの数値を掛け合わせるとオーバーフローが発生するという特殊なケースを処理したいと思います。コードは次のようになります。
これは簡略化されたバージョンです。実際のプログラムa
でb
は、実行時に他の場所から供給されます。私が達成したいのは次のようなものです。
これをコーディングするのに最適な方法をどのように提案しますか?
更新:a
そしてb
私のシナリオでは常に負ではありません。
c - 2 つの大きな整数の乗算中にオーバーフローをキャッチして計算する
比較的大きな数を乗算し、結果を1つまたは複数の整数に格納するための効率的な(オプションで標準的でエレガントで実装が簡単な)ソリューションを探しています。
次のように宣言された 2 つの 64 ビット整数があるとします。
私が行うときa * b
、操作がオーバーフローになったかどうかをどのように検出し、この場合キャリーをどこかに保存できますか?
数値を格納する方法に制約があるため、多数のライブラリを使用したくないことに注意してください。