Nuestro equipo de trabajo ha pasado mucho tiempo buscando la solución a tus interrogantes, te compartimos la resolución de modo que deseamos resultarte de mucha apoyo.
Desde el siguiente enlace:
INT34-C. No cambie una expresión por un número negativo de bits o por mayor o igual que el número de bits que existen en el operando
Ejemplo de código no conforme (desplazamiento a la derecha)
El resultado de E1 >> E2
es E1
desplazado a la derecha E2
posiciones de bits. Si E1
tiene un tipo sin firmar o si E1
tiene un tipo con signo y un valor no negativo, el valor del resultado es la parte integral del cociente de E1 / 2E2. Si E1
tiene un tipo con signo y un valor negativo, el valor resultante está definido por la implementación y puede ser un desplazamiento aritmético (con signo):
o un turno lógico (sin firmar):
Este ejemplo de código no compatible no prueba si el operando derecho es mayor o igual que el ancho del operando izquierdo promocionado, lo que permite un comportamiento indefinido.
unsigned int ui1;
unsigned int ui2;
unsigned int uresult;
/* Initialize ui1 and ui2 */
uresult = ui1 >> ui2;
Hacer suposiciones sobre si un cambio a la derecha se implementa como un cambio aritmético (con signo) o como un cambio lógico (sin signo) también puede generar vulnerabilidades. Ver recomendación INT13-C. Use operadores bit a bit solo en operandos sin signo.
No, no puedes confiar en este comportamiento. El desplazamiento a la derecha de cantidades negativas (que supongo que trata su ejemplo) está definido por la implementación.
Del último borrador de C++20:
El desplazamiento a la derecha en tipos integrales con signo es un desplazamiento aritmético a la derecha, que realiza una extensión de signo.