-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