-1 сдвиг влево на 31
System.out.println((-1<<31));
почему это дает выход -2147483648
Я знаю, что -1(int)Math.pow(2,31) это равно 2147483648
3 ответов
-1<<31
дает 10000000000000000000000000000000
что это -2147483648
, а не 2147483648
. Обратите внимание, что левый бит-это знаковый бит, поэтому, если он равен 1, это отрицательное число.
кстати, 1<<31
и -2147483648
С 2147483648
выше Integer.MAX_VALUE
. С другой стороны,--8--> даст вам 2147483648
, так как результат будет long
.
Я знаю, что -1
Это было бы так, если int
был двойкойбез подписи примитивно; но есть.
вы правы в том, что в двоичном файле это действительно дает то, что вы говорите; однако, поскольку это примитив дополнения со знаком два, результат будет x(0) * 2^0 + x(1) * 2^1 + ... + x(n-2) * 2^(n-2) - x(n-1) * 2^(n-1) (минус, не плюс), где x(y)
- значение y-го бита, считая от 0.
отсюда и ваш результат.
В настоящее время в большинстве архитектур номера хранятся в 2-дополнениях, см. Википедия.
Итак, ваш результат верен. Бит знака установлен, и все остальные нули (потому что 2-дополнение) делают это самое отрицательное число для этого типа данных, см. здесь.
мышление в 2-х дополнениях
-1 is represented by 1111 1111 1111 1111 1111 1111 1111 1111
31 сдвиг влево дает
1000 0000 0000 0000 0000 0000 0000 0000 which represents -2.147.483.648