Важное замечание по поводу линии
System.out.print((long)(1 << (63)));
Сначала вы берете (1 << 63)
, а , а затем , которые вы используете на длинные В результате вы фактически смещаетесь влево в целых числах, поэтому длинное приведение не имеет никакого эффекта. Вот почему сдвиг влево на 63 бита дает минимальное целое число, а не минимальное.
Но есть еще один, более важный момент. Длинные Java всегда подписаны, поэтому даже строка
System.out.print(1L << 63);
даст отрицательное число. В дополнение к двум, всякий раз, когда крайний левый бит равен 1, число является отрицательным.
На самом деле вы не можете представить число 2 63 = 9223372036854775808 в примитивном типе Java, поскольку это число больше максимальной длины, а long
- самый большой тип примитива. Вы можете представить это число как BigInteger . Вы даже можете сгенерировать его через сдвиг влево на 63 с кодом
BigInteger.ONE.shiftLeft(63)