Вы получили отрицательное значение, поскольку вы превысили максимальное значение, которое может содержать long
. Когда вы превышаете максимальное значение, оно начинается снова с минимального значения до числа, превышающего максимальное значение. То же самое верно и для случая, когда вы пытаетесь присвоить число, меньшее минимального значения, переменной long
. Чтобы понять это, вы можете посмотреть на вывод следующей программы:
public class Main {
public static void main(String[] args) {
System.out.println("Long.MAX_VALUE: "+Long.MAX_VALUE);
System.out.println("Long.MIN_VALUE: "+Long.MIN_VALUE);
long x = Long.MAX_VALUE + 1;
long y = Long.MIN_VALUE - 1;
System.out.println("Long.MAX_VALUE + 1: "+x);//will be assigned the value of Long.MIN_VALUE
System.out.println("Long.MIN_VALUE - 1: "+y);//will be assigned the value of Long.MAX_VALUE
x = Long.MAX_VALUE + 2;
y = Long.MIN_VALUE - 2;
System.out.println("Long.MAX_VALUE + 2: "+x);//will be assigned the value of Long.MIN_VALUE + 1
System.out.println("Long.MIN_VALUE - 2: "+y);//will be assigned the value of Long.MAX_VALUE - 1
}
}
Вывод:
Long.MAX_VALUE: 9223372036854775807
Long.MIN_VALUE: -9223372036854775808
Long.MAX_VALUE + 1: -9223372036854775808
Long.MIN_VALUE - 1: 9223372036854775807
Long.MAX_VALUE + 2: -9223372036854775807
Long.MIN_VALUE - 2: 9223372036854775806
Для ваших требований вам понадобится BigInteger
например,
BigInteger bi = new BigInteger("18000000000000000000");