Saltar al contenido

Desplazamiento a la derecha y entero con signo

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):
Desplazamiento aritmético (con signo)

o un turno lógico (sin firmar):
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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *