Operadores de desplazamiento bit a bit. Firmado y sin firmar

Estoy practicando para el examen SCJP usando notas de cram de Internet.

De acuerdo con mis notas, se supone que el operador >> está firmado con el desplazamiento a la derecha, con el bit de signo traído desde la izquierda. Mientras que el operador de desplazamiento a la izquierda << se supone que conserva el bit de signo.

Sin embargo, jugando puedo cambiar el signo con el operador << (fe Integer.MAX_VALUE << 1 evalúa a -2 , mientras que nunca puedo cambiar el signo con el operador >> .

Debo estar malinterpretando algo aquí, ¿pero qué?

“>>” está firmado porque mantiene el signo. Utiliza la mayoría del dígito izquierdo en la representación binaria de un número como relleno. Por ejemplo:

  | this value is used as a filler 11011011 >> 11101101 01010010 >> 00101001 

“>>>” es una versión sin firma de este operador. Siempre utiliza cero como relleno:

  11011011 >>> 01101101 01010010 >>> 00101001 

En representación binaria, el dígito más a la izquierda determina el signo del número. Entonces, si es ‘1’ entonces tenemos un valor negativo y si es ‘0’ – entonces nuestro número es positivo. Es por eso que usar el dígito más a la izquierda como relleno permite mantener el signo permanente.

La idea detrás de los cambios es que pueden actuar como multiplicando y dividiendo por potencias de 2 (<< 1 es equivalente a * = 2, >> 2 es equivalente a / = 4), por lo que existe la versión firmada de desplazamiento. Sin embargo, el cambio sin signo no conserva los negativos, necesariamente. El operador << en realidad no conserva el signo, como sugiere; simplemente sucede en tu ejemplo. Intenta hacer un cambio a la izquierda en 2,147,483,647; no se mantiene positivo. La razón por la que no se molestan en intentar hacer un cambio de horario "firmado" es porque, si el número cambia de positivo a negativo (o viceversa), de todos modos saliste de los límites del tipo de variable.