Причины возникновения целочисленного переполнения уже были объяснены в других ответах.
Практический способ обеспечить длинную арифметику в вычислениях - это использовать числовые литералы с суффиксом l
, которые объявляют литералы как long
.
Обычное целочисленное умножение, которое переполняется:
jshell> 100000 * 100000
$1 ==> -727379968
Умножение, где один из мультипликатов имеет суффикс l
, который не переполняется:
jshell> 100000 * 100000l
$1 ==> 1000000000000
Обратите внимание, что long
s также подвержены переполнению, но диапазон намного больше, от -9,223,372,036,854,775,808
до 9,223,372,036,854,775,807
.