問題タブ [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 投票する
5 に答える
4365 参照

c# - -1 * int.MinValue == int.MinValue?? これはバグですか?

C#で私はそれを見る

これはバグですか?検索ツリーを実装しようとしていたとき、それは本当に私を台無しにしました。(int.MinValue + 1)ちゃんと無効化できるように使ってしまった。

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

java - J2MEで2進数/数値のオーバーフローを見つけて処理する方法

MathFPライブラリを使用するユニットコンバータプログラムを構築しています。通常、単位変換は次の式で行われます。

U1(ユニット1)* K(定数)= U2(ユニット2)

intがオーバーフロー/アンダーフローしたことを検出できるようにしたいですか?これがいつ発生したかを検出し、問題を適切に処理するにはどうすればよいですか。long型のプリミティブでオーバーフローを処理したいので、理想的には一般的な解決策を探しています。

私が持っている唯一のアイデアは:

これらの変換には、doubleなどの別のプリミティブデータ型を使用する必要がありますか?

よろしくお願いします

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

c - GCC インライン アセンブリ乗算

Linux (x86) で GCC インライン アセンブリを学習しようとしています。最初の実験は、乗算の整数オーバーフロー検出を実装することでした。簡単に思えますが、理解できない副作用があります。

したがって、ここでは 2 つの符号なし 8 ビット整数を乗算し、結果がオーバーフローするかどうかを確認します。基本的に、最初のオペランドを AL レジスタにロードし、もう 1 つのオペランドを BL レジスタにロードしてから、mul命令を使用します。結果は 16 ビット値として AX レジスタに格納されます。bそのため、オーバーフローしない限り、AX レジスタの値を C 変数にコピーします。オーバーフローした場合はc1 に設定します。

これはうまくいくようです。printf'b' の値が 250 である場合、これは正しいです。また、「b」の開始値を 26 に変更すると、乗算後cに 1 に設定され、もちろん (10 * 26 > ~uint8_t(0)) によるオーバーフローを示します。私が見ている問題はa、乗算後に C 変数が 0 (またはオーバーフローで 1) に設定aされていることです。出力変数のリストにも載っていないのに、アセンブリ ルーチンが の値に影響するのはなぜaですか?

また、破壊されたレジスタのリストについてもよくわかりません。このリストは、GCC がそれらを誤って使用しようとしないように、アセンブリ ルーチン中に使用されたレジスタについて GCC に通知することになっています。AL レジスタと BL レジスタを使用したことを GCC に通知する必要があると思いますが、AX レジスタはどうでしょうか。2 つの 8 ビット整数の積を格納するために暗黙的に使用されているため、破壊されたレジスタのリストに含める必要がありますか?

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

java - Java算術

このコードが間違った値を返すのはなぜですか?

0 投票する
1 に答える
5442 参照

mips - 32ビットレジスタを使用した倍精度整数減算(MIPS)

私はコンピューターの算数を学んでいます。私が使っている本(パターソンとヘネシー)には、以下の質問があります。

mipsコードを記述して、64ビットデータの倍精度整数減算を実行します。最初のオペランドがレジスタ$t4(hi)と$ t5(lo)にあり、2番目が$ t6(hi)と$ t7(lo)にあると仮定します。

答えに対する私の解決策は

ただし、この問題の解決策を示した作成者は次のとおりです。

符号付き倍精度整数の場合、

符号なし倍精度整数の場合、

sub/addとの動作の違いについての私の理解はsubu/addu、オーバーフロー例外はで生成され、では生成されsub/addないということですsubu/addu。オペランドのビットの減算/加算sub/addsubu/addu、符号付きまたは符号なしのオペランドの解釈は、insltおよびsltu命令とは異なり、結果に違いはありません。

質問1
私は、オーバーフロー検出が処理されているという解決策を与えられた著者から推測していますが、私の解決策では同じことを考えていませんでした。私は正しいですか?他に足りないものはありますか?

質問2上記の推論が正しいと仮定すると、と
を使用して符号なし倍精度を減算する場合に、作成者が提供したソリューションのオーバーフロー検出がオフになっているのはなぜですか?addusubu

0 投票する
13 に答える
34555 参照

c++ - C/C++ での符号付きオーバーフローの検出

一見すると、この質問は整数オーバーフローを検出する方法の重複のように思えるかもしれません。ですが、実際には大きく異なります。

符号なし整数のオーバーフローを検出することは非常に簡単ですが、C/C++ で符号付きオーバーフローを検出すること、実際にはほとんどの人が考えるよりも難しいことがわかりました。

それを行うための最も明白でありながら単純な方法は、次のようなものです。

これに関する問題は、C 標準によると、符号付き整数のオーバーフローが未定義の動作であることです。 言い換えれば、標準によれば、符号付きオーバーフローを引き起こすとすぐに、プログラムは null ポインターを逆参照した場合と同じように無効になります。したがって、未定義の動作を引き起こすことはできず、上記の事後条件チェックの例のように、事後にオーバーフローを検出しようとします。

上記のチェックは多くのコンパイラで機能する可能性がありますが、期待することはできません。実際、C 標準では符号付き整数のオーバーフローは未定義であると述べられているため、最適化フラグが設定されている場合、一部のコンパイラ (GCC など) は上記のチェックを最適化して除外します。これにより、オーバーフローをチェックする試みが完全に中断されます。

したがって、オーバーフローをチェックする別の方法は次のとおりです。

このような加算を実行してもオーバーフローが発生しないことを事前に確認するまで、2 つの整数を実際に加算しないため、これはより有望に思えます。したがって、未定義の動作は発生しません。

ただし、残念ながら、このソリューションは、加算演算が機能するかどうかをテストするためだけに減算演算を実行する必要があるため、最初のソリューションよりも効率が大幅に低下します。この (小さな) パフォーマンス ヒットを気にしないとしても、このソリューションが適切であると完全に確信しているわけではありません。この式lhs <= INT_MIN - rhsは、符号付きオーバーフローが不可能であると考えて、コンパイラが最適化して取り除く可能性のある式とまったく同じように見えます。

ここでより良い解決策はありますか?1) 未定義の動作を引き起こさないこと、および 2) オーバーフロー チェックを最適化する機会をコンパイラに提供しないことが保証されているものはありますか? 両方のオペランドを符号なしにキャストし、独自の 2 の補数演算をローリングしてチェックを実行する方法があるのではないかと考えていましたが、その方法がよくわかりません。

0 投票する
1 に答える
1182 参照

c++ - 減算時の整数オーバーフローの種類

Sams Teach Yourself C++ in 21 Days (6th ed.) を使用して、C++ をもう一度学習しようとしています。各章を確実に理解できるように、非常に徹底的に作業するようにしています (ただし、C 構文言語には既に精通しています)。

第 5 章 (リスト 5.2) の冒頭付近で、符号なし整数のオーバーフローについて指摘されています。彼らの例に基づいて、私はこれを書きました:

これにより、次の出力が得られますが、これは驚くべきことではありません。

宣言する行がbignum代わりに読み取るようにプログラムを変更すると、代わりunsigned int bignum = 3000000000;に出力が

これらの最初のものは明らかに問題ありません。その数は、正確に1294967346であるという事実によって説明されます。によって貢献された 50 のために、なぜ 2 行目が と読まないのか理解できません。12949673462^32 - 30000000001294967396smallnum

3行目と 4 行目は説明できません。これらの結果はどのようにして得られるのでしょうか?

2^32編集: 3 行目 -符号付き int に許可されている値の範囲に収まるモジュロを法とする解を見つけるだけで、この結果が得られますか?

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

c# - 1000000000 * 3 = -1294967296?

よくわかりません!

今日は11月3日です

shazbotは-1294967296に出てきます

は???

0 投票する
1 に答える
1736 参照

c++-cli - オブジェクトを C++ 組み込み型に変換する

次の最小限のコードがあります。

それは機能のOverflowException例外を与えget_propます。最後にget_prop、純粋な C++ コードでの結果を使用する必要があります。get_propどちらの場合でも例外なく機能するように関数を記述する正しい方法は何ですか。C++ のようなある種のテンプレートを使用できますか、それとももっと簡単な解決策がありますか?

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

c - 32ビット整数型のみを使用して(a x b)をcで割った値を計算する方法(a x bがそのような型に適合しない場合でも)

リファレンス実装として、次のことを考慮してください。

64ビット整数型を必要としない実装(Cまたは擬似コード)に興味があります。

私は次のような概要を示す実装のスケッチを開始しました。

ただし、オーバーフローを回避し((a / d1)*(b / d2)<= UINT32_MAX)、計算全体のエラーを最小限に抑えることができるd1とd2の値を選択するのは困難です。

何かご意見は?