parece que su aplicación es, probablemente, haciendo un desplazamiento de bits aritméticas con números en complemento de dos. En este sistema, desplaza todos los bits hacia la derecha y luego rellena los bits superiores con una copia de lo que fue el último bit. Así, por tu ejemplo, int tratar como 32 bits aquí:
nPosVal = 00000000000000001111111111111111
nNegVal = 11111111111111110000000000000001
Después del cambio, tienes:
nPosVal = 00000000000000000111111111111111
nNegVal = 11111111111111111000000000000000
Si convierte esto de nuevo a decimal, se obtiene 32767 y -32768 respectivamente.
Efectivamente, un cambio a la derecha redondea hacia el infinito negativo.
Editar: De acuerdo con la Sección 6.5.7 de la última draft standard, este comportamiento en números negativos es dependiente de la implementación:
El resultado de E1 E2 es E1 >> posiciones de bits de derecha desplazado E2. Si E1 tiene un tipo sin signo o si E1 tiene un tipo firmado y un valor no negativo, el valor del resultado es la parte integral del cociente de E1/2
E2. Si E1 tiene un tipo firmado y un valor negativo, el valor resultante está definido por la implementación.
Su declarada rational para esto:
El Comité C89 afirmó la libertad en la ejecución otorgada por K & R en que no requiere la operación de desplazamiento a la derecha firmado a firmar extender, ya que este requisito podría reducir la velocidad de código rápido y desde la utilidad de firmar cambios extendidos es marginal. (El cambio de un número entero negativo dos complemento aritméticamente correcta lugar es
no lo mismo que dividir por dos!)
Así que es dependiente de la implementación en la teoría. En la práctica, nunca he visto una implementación no hacer un desplazamiento aritmético a la derecha cuando el operando izquierdo está firmado.
+1, eso es lo que quería saber. El cambio a la derecha gira hacia el infinito negativo. Pero está documentado? – Alphaneo
Depende de la implementación. (Ver mi edición anterior.) Como dije, nunca he visto una implementación diferente en esto, pero teóricamente podría. – Boojum