Doğrudan düzenleyerek değiştirmeden John Kugelman'ın cevabını geliştirmek istiyorum. Simetrisi nedeniyle test durumu ( MIN_VALUE = -10
, MAX_VALUE = 10
) için çalışır MIN_VALUE == -MAX_VALUE
, ki bu ikinin tamamlayıcı tamsayıları için geçerli değildir. Gerçekte 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)
Doğruya uygulandığında MIN_VALUE
ve MAX_VALUE
John Kugelman'ın cevabı, ne zaman a == -1
ve b ==
başka herhangi bir şeyde bir taşma durumu ortaya çıkarır (ilk olarak Kyle tarafından ortaya atılan nokta). İşte düzeltmenin bir yolu:
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
}
Herhangi için genel bir çözüm değil MIN_VALUE
ve MAX_VALUE
fakat Java'nın için geneldir Long
ve Integer
ve herhangi bir değer a
ve b
.