私は、整数の除算にスローされる方法をOverflowExceptionが停止することができますか?

StackOverflow https://stackoverflow.com/questions/1300777

質問

私は、私はそれを望んでいない(またはので、私は思う)ときに私を投げさんのOverflowExceptionがを取得しています。私は値がオーバーフローしたビットを破棄し、オーバーフローを期待するいくつかの奇妙な計算を行っております。私が、これはしかし、正しく動作させることはできませんようです。基本的にこれは私が巨大なセット(int.MaxValueにint.MinValue)を反復として起こるiとjの1組である。

// i and j are ints
// i is -2147483648
// j is -1
var x = i / j;

// I also tried using unchecked keyword, but it doesn't help    
var x = unchecked(i / j);

アップデートます:

-2147483648 / -1の期待数学値はしかし2147483648で、この特定のコードは本当に番号を検索しようとしません。これは、ハードビットは理解することがなくなってビット操作物事のシリーズの一部です。正直に言うと、私も、私は本当に方法を文書化していなかったので、意図が何であったか自分自身を知っていない、そしてそれが取ったすべては私の頭の上に深刻なWTF-気泡を高めるために一日離れてからでした。すべての私はケースを処理するために設計された特別なコードで意図したとおり、それは動作します知っています。

期待値についてます:

それがマックスの時にintは唯一の2147483647を保持することができますので、

、私はオーバーフロー降伏値0を捨てることを期待します。

私は全くこのことについて何かを学んだ場合は、

、それはおそらく無名の方法に関するドキュメントの重要性です。

役に立ちましたか?

解決

私は、これはあなたがこの例外を取得しますここで、ののみの場合であると考えています。それはオーバーフローすることができますInt32の範囲内でのみ部門です。 (そこのコースのゼロによる除算だが、それは別の例外です。)

あなたがOverflowExceptionを避けたいのであれば、

は、<全角>のみは、このケースに対処する必要があります。あなたはそれが何をすべきかをしたいですか?この正確の場合スポット、およびそれ以外は正常な分割を行う方法を記述します。

注:あなただけの結果を否定することで比較を逆転しようとしない理由、これがまたあります。あなたの代わりに、昇順の場合、代わりに-Compare(x, y)使用Compare(y, x)を使用しての降順で何かをソートしたい場合。否定は(あなたがチェックする文脈でない限り)int.MinValueのためのオーバーフローを与えるものではありません - それはただ黙っint.MinValueを返します。

他のヒント

補数は、整数2 ^ 32の範囲であることを意味する - そう/ -1 -2147483648がintで表すことができない数を返している、1 -2 ^ 32

あなたはlongにそれを置くことを試みることができます。このような状況でvarを使用する理由はありません。

あなたはInt64から/へのキャストのビットでこの問題を回避することができます:

var x = (int)((long)i / j);

あなたはこれを行います。なぜ、あなたはここでvarを使うのでしょうか?これは、

...あなたはすべての1つの文字を保存するための演算結果の種類を表示する機能を失います
long x = (long)i / j;

あなたが飽和状態にしたい場合は、次のことができます。

int x = (int)Math.Min((long)i / j, int.MaxValue);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top