私は、整数の除算にスローされる方法をOverflowExceptionが停止することができますか?
-
18-09-2019 - |
質問
私は、私はそれを望んでいない(またはので、私は思う)ときに私を投げさんの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
を使うのでしょうか?これは、
long x = (long)i / j;
あなたが飽和状態にしたい場合は、次のことができます。
int x = (int)Math.Min((long)i / j, int.MaxValue);