2つの数値の合計/乗算が長い整数の最大値を超えているかどうかを検出する際に問題があります。
例コード:Java番号がlong.max_valueを超えています - どのように検出するのですか?
long a = 2 * Long.MAX_VALUE;
System.out.println("long.max * smth > long.max... or is it? a=" + a);
私はそれがNumberFormatException
...
を投げることを期待しながら、これは、私に-2
を与え、この作品を作る簡単な方法はありますか?ネストされたIFブロックまたはループ内での加算で乗算を行うコードがいくつかあるので、各IFまたはループ内にIFを追加することは嫌です。
編集:まあ、別の質問から、この答えは私が必要なもののために最も適切であると思わ:https://stackoverflow.com/a/9057367/540394
私はそれがunnecassaryオーバーヘッドが追加されますようにボクシング/アンボクシングを行うにはしたくないし、この方法は非常にあります短く、私には大きなプラスです。私はちょうど2つの短い関数を書いて、これらのチェックを行い、最小値または最大値を返します。
EDIT2:あなたは、これは間違っていると思われる場合
/**
* @param a : one of the two numbers added/multiplied
* @param b : the other of the two numbers
* @param c : the result of the addition/multiplication
* @return the minimum or maximum value of a long integer if addition/multiplication of a and b is less than Long.MIN_VALUE or more than Long.MAX_VALUE
*/
public static long limitLong(long a, long b, long c)
{
return (((a > 0) && (b > 0) && (c <= 0))
? Long.MAX_VALUE
: (((a < 0) && (b < 0) && (c >= 0)) ? Long.MIN_VALUE : c));
}
を教えてください:ここで私は上記にリンクされて答えに応じてその最小/最大値に長いを制限するための機能です。
+1。整数オーバーフローの検出を可能にするライブラリが必要です。 – Thilo
また、開発者がin-inで実行されるすべての数学コードのオーバーフローエラーを可能にする特別なブロック(最終的に何か?)があります。編集:それは[C#のブロックをチェックし、チェックを外した](http://msdn.microsoft.com/en-us/library/a569z7k8.aspx)を見つけました。 –
まあ、C#はオーバーフロー(私は非常に沈黙と私に意味をなさない間違った結果を好むだろう)のエラーをスローするようだ... – jurchiks