Я хотел бы опираться на ответ Джона Кугельмана, не заменяя его, редактируя его напрямую. Это работает для его тестового примера (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)
При применении к истинным MIN_VALUE
и MAX_VALUE
ответ Джона Кугельмана дает случай переполнения, когда 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
.