問題タブ [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.

0 投票する
9 に答える
5116 参照

language-agnostic - デフォルトで、言語が整数オーバーフローでエラーを発生させないのはなぜですか?

いくつかの最新のプログラミング言語 (C++、Java、および C# を含む) では、この言語では、実行時に整数オーバーフローが発生しても、エラー状態が発生することはありません。

たとえば、オーバーフロー/アンダーフローの可能性を考慮していない、この (考案された) C# メソッドについて考えてみましょう。(簡潔にするために、このメソッドは、指定されたリストが null 参照の場合も処理しません。)

このメソッドが次のように呼び出された場合:

sumList()メソッドでオーバーフローが発生します( intC# の型は 32 ビット符号付き整数であり、リスト内の値の合計が最大 32 ビット符号付き整数の値を超えるため)。sum 変数の値は -294967296 になります (4000000000 の値ではありません)。これはおそらく、sumList メソッドの (架空の) 開発者が意図したものではありません。

明らかに、開発者が整数オーバーフローの可能性を回避するために使用できるさまざまな手法があります。たとえば、Java の のような型を使用しBigIntegerたり、 C# でcheckedキーワードと/checkedコンパイラ スイッチを使用したりします。

しかし、私が興味を持っているのは、これらの言語が、たとえば、実行時に操作が実行されたときに例外を発生させて、オーバーフロー。このような動作は、オーバーフローが発生する可能性のある算術演算を実行するコードを記述する際に、開発者がオーバーフローの可能性を考慮することを怠った場合に、バグを回避するのに役立つようです。(これらの言語には、開発者がその動作を明示的に意図している場合に、例外が発生することなく整数オーバーフローの発生が許可されるブロックを指定できる「unchecked」キーワードのようなものが含まれていた可能性があります。C# には実際に this . )

答えは単純にパフォーマンスに帰着しますか?言語設計者は、該当するすべての算術演算で、オーバーフローが発生したかどうかを確認するためにランタイムが余分な作業を行う必要がある「遅い」算術整数演算をそれぞれの言語にデフォルトで設定することを望んでいませんでした。操作 - このパフォーマンスの考慮事項は、不注意なオーバーフローが発生した場合の「サイレント」障害を回避する価値を上回りましたか?

パフォーマンスの考慮事項以外に、この言語設計の決定にも他の理由はありますか?

0 投票する
6 に答える
5617 参照

c# - 符号なし右シフトを使用して C# での整数オーバーフローを防ぐことはできますか?

私は、lareValue1 と largeValue2 のすべての可能な値 (これらは少なくとも 1 です) を含む正の数を alwaysPositive に割り当てたいと考えています。

次のステートメントは、バッファ オーバーフローを引き起こします。

減算して追加することでそれを防ぐことができることを私は知っています:

しかし、他のプログラミング言語では、符号なしビットシフトを使用してトリックを実行できます。

C#でこれを行うにはどうすればよいですか?


以下の答えはすべて問題を解決します。これを行う方法はおそらくたくさんありますが、それらすべて (私の解決策を含む) には共通点が 1 つあります。

0 投票する
31 に答える
387334 参照

c++ - 符号なし整数の乗算オーバーフローを検出するにはどうすればよいですか?

a b = cのすべての解を見つけるために C++ でプログラムを作成していました。ここで、 ab、およびcは一緒にすべての数字 0-9 を 1 回だけ使用します。プログラムはabの値をループし、 aba bで毎回桁カウント ルーチンを実行して、桁数の条件が満たされているかどうかを確認しました。

ただし、 a bが整数の制限を超えると、偽の解が生成される可能性があります。私は次のようなコードを使用してこれをチェックしました:

オーバーフローをテストするより良い方法はありますか? 一部のチップには、オーバーフローが発生したときに設定される内部フラグがあることは知っていますが、C または C++ を介してアクセスされるのを見たことがありません。


符号付き intオーバーフローは C および C++ では未定義の動作であるため、実際に発生させずに検出する必要があることに注意してください。加算前の signed int オーバーフローについては、C/C++ での符号付きオーバーフローの検出を参照してください。

0 投票する
6 に答える
8840 参照

c - size_tの追加でオーバーフロー

VS.NETとGCCのコード警告を無料にし、64ビットのコードを用意したいと思っています。

今日、私はメモリバッファを処理し、ファイルスタイルのインターフェイスを介してデータへのアクセスを提供する小さなモジュールを作成しました(たとえば、バイトの読み取り、バイトの書き込み、シークアラウンドなど)。

現在の読み取り位置とサイズのデータ​​型として、size_tを使用しました。これが最も自然な選択であると思われるためです。警告を回避し、64ビットでも動作するはずです。

念のため:私の構造は次のようになります:

の符号はsize_t実際には定義されていないようです。グーグルのコード検索はそれを証明した。

今、私はジレンマに陥ってsize_tいます。ユーザーが提供したデータを処理する必要があり、サードパーティのライブラリが私のコードを使用するため、オーバーフローがないか追加をチェックしたいと思います。ただし、オーバーフローチェックでは、符号を知る必要があります。それは実装に大きな違いをもたらします。

では、プラットフォームやコンパイラに依存しない方法で、このようなコードをどのように書くべきでしょうか?

size_t実行時またはコンパイル時にの署名を確認できますか?それは私の問題を解決するでしょう。あるいはsize_t、そもそも最善のアイデアではなかったのかもしれません。

何か案は?

編集:私はC言語の解決策を探しています!

0 投票する
6 に答える
8694 参照

c# - PHP 整数オーバーフローを強制する

いくつかの整数演算は、歴史的な理由から、静的に型付けされたいくつかの言語と同じように PHP でも動作する必要があります。最後に PHP をアップグレードしてから、整数のオーバーフローに対する動作が変更されました。基本的には次の式を使用しています。

ただし、変換があっても:

私はまだ完全に間違った番号になってしまいます...

たとえば、$x1 = -1580033017、$x2 = -2072974554、$x3 = -1170476976) および $x4 = -1007518822 では、PHP では -30512150、C# では 1617621783 になります。

$x1 と $x2 を加算するだけでは、正しい答えが得られません。

C#で私は得る

PHP の場合:

これは次と同じです:

「IntegerOverflowAdd」関数などを書いても構いませんが、(-1580033017 + -2072974554) がどのように 641959725 に等しいかはよくわかりません (-2147483648 + (2 * 2^31) であることは認識しています)。 、しかし -2147483648 + 2^31 は -1505523923 であり、Int.Min よりも大きいので、なぜ 2^31 ではなく 2*2^31 を追加するのですか?)

どんな助けでも大歓迎です...

0 投票する
7 に答える
20681 参照

c++ - 任意に大きな整数を処理する方法

私はプログラミング言語に取り組んでおり、今日、階乗関数(再帰)をコンパイルできるポイントを得ましたが、整数の最大サイズのために、取得できる最大はfactorial(12)です。任意の最大サイズの整数を処理するためのいくつかの手法は何ですか? この言語は現在、コードを C++ に変換することで機能します。

0 投票する
10 に答える
6962 参照

java - Java乗算操作の動作

指定された数値を日からミリ秒に変換するメソッドを作成しました。

私は自分が何を間違えたかを理解するのに苦労しました。今私の質問: そのエラーはとても明白ですか?

修正された方法:

計算する前に整数をlongに変換しないと、完全に間違った結果が得られます。

0 投票する
6 に答える
9274 参照

c# - 配列のサイズは int の上限 (2147483647) によって制限されますか?

私はProject Eulerの演習をいくつか行っていますが、2,147,483,647 ( C#の上限) を超える配列が必要なシナリオに遭遇しました。int

確かにこれらは大きな配列ですが、たとえば、これはできません

では、より大きな配列を使用できますか?

編集:アトキンのふるい用だったので、本当に大きなものが欲しかったのです:D

0 投票する
2 に答える
477 参照

.net - この整数オーバーフローが発生するのはなぜですか?

Web サービスで out パラメータとして整数を持つ dll メソッドをラップしました。テストでは、-1 を期待していたときに、代わりに 65,535 を取得していることがわかりました。dll が 16 ビット整数を使用していて、コードで外部 dll を参照するときに標準の .NET 32 ビット整数を指定していたことに気付きました。これは、16 ビット整数を指定することですぐに修正され、すべて問題ありません。

私の質問は、なぜこれが起こったのですか?32 ビット整数を 16 ビット整数に合わせようとすると、オーバーフローが発生することは理解できましたが、なぜこれが逆に発生するのかはよくわかりません。明らかに、このタイプのタイプ間のキャストに関する私の理解は少し不足しているため、ガイダンスをいただければ幸いです。

0 投票する
4 に答える
3091 参照

c - より大きな幅の整数に代入するときの C 整数オーバーフロー動作

Cで次のコードを実行すると:

結果として「-4000」が正しく出力されます。しかし、私は少し混乱しています。より大きな符号なし整数を他の整数から減算すると、算術オーバーフローが発生するのではないでしょうか? ここではどのようなキャスティング ルールが適用されますか? この質問は少し初心者のようですので、参考にしていただければ幸いです。