John Kugelmanの回答を、直接編集することで置き換えずに構築したいと思います。これは、2の補数の整数には当てはまらないの対称性のためMIN_VALUE = -10
、彼のテストケース(、MAX_VALUE = 10
)で機能しMIN_VALUE == -MAX_VALUE
ます。実際には、MIN_VALUE == -MAX_VALUE - 1
。
scala> (java.lang.Integer.MIN_VALUE, java.lang.Integer.MAX_VALUE)
res0: (Int, Int) = (-2147483648,2147483647)
scala> (java.lang.Long.MIN_VALUE, java.lang.Long.MAX_VALUE)
res1: (Long, Long) = (-9223372036854775808,9223372036854775807)
trueに適用された場合MIN_VALUE
やMAX_VALUE
、ジョン・Kugelmanの答えは、オーバーフローケース生成a == -1
とb ==
(最初のカイルが提起した時点)何かを。これを修正する方法は次のとおりです。
long maximum = Long.signum(a) == Long.signum(b) ? Long.MAX_VALUE : Long.MIN_VALUE;
if ((a == -1 && b == Long.MIN_VALUE) ||
(a != -1 && a != 0 && ((b > 0 && b > maximum / a) ||
(b < 0 && b < maximum / a))))
{
// Overflow
}
それは一般的なソリューションではありません MIN_VALUE
とMAX_VALUE
、それはJavaのために一般的であるLong
とInteger
の任意の値a
とb
。