2012-02-08 8 views
15

unsigned intにオーバーフロー時の内容は?具体的には、2つのunsigned intとの乗算を行いたいと思います。乗算が完了したら、unsigned intには何が入りますか?符号なしIntのオーバーフロー

unsigned int someint = 253473829*13482018273; 
+0

これは、http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c –

+1

の複製であるようです。どうすれば試してみるのですか?一般に、符号なしのintがオーバーフローすると、それはゼロにロールオーバーします。したがって、 'UINT_MAX + 5'はロールオーバーして4になります。 –

+0

最大値とオーバーフロー値となる値の差です。簡単にすることができます。 max uintが5であるとします。2 * 4を追加して8の代わりに最終値を3にします。 –

答えて

22

unsigned番号オーバーフローすることはできませんが、代わりに剰余の性質を利用して折り返します。

たとえば、unsigned intが32ビットの場合、結果は(a * b) mod 2^32になります。


CharlesBaileyが指摘したように、253473829*13482018273が変換される前に符号付き乗算を使用することができ、そしてあなたが乗算前unsignedについて明示する必要があります:

unsigned int someint = 253473829U * 13482018273U; 
+0

は標準の一部ですか? –

+2

@Zhenyaはい、CとC++の両方です。 – Pubby

+0

@Zhenya - それは重要ですか?答えは100%正しいです。 UINT_MAX + 5という言葉の技術的な意味は4です。これは.NET言語とJavaの両方で真実のままです。少なくとも.NETの場合、NaNは、値(ほとんどの場合)が正確に表現されないdoubleのような型に限定されます。 –

5

符号なし整数オーバーフロー、その署名の対応、展示とは異なり、明確に定義された動作。

値は基本的に "ラップ"されます。安全で一般的にカウントダウンやハッシュ/モディファイ機能に使用されます。

+3

符号なしはオーバーフローしません –

+1

私は、それが類似していることに関連して説明しようと比較することを意味しました。私は後でラップアラウンドビットで私のステートメントを修飾しました。ああの技術。 – evandrix

-3

これはおそらくコンパイラによって異なります。私はこの数年前のようなエラーがありました。時にはランタイムエラーが発生することもありました。これは基本的には最高レベルのビットを切り捨てて残りの部分を残してしまうような、あなたの乗算の結果は34ビットの数値になります。それは上位2ビットを切り捨てて残りの部分を与えます。おそらく、あなたが得るものを正確に見るためにあなたのコンパイラでそれを試す必要があります。異なるコンパイラで得られるものと同じではないかもしれません。特に、オーバーフローが式の途中で起こって最終結果が符号なし整数の範囲。

+0

**符号なし**オーバーフローはコンパイラに依存せず、ラップアラウンドセマンティクスを持つように標準化されています。定義されていない値につながるのは** signed ** overflowだけなので、コンパイラに依存する可能性があります。 – cmaster

関連する問題