sintaxis - tipos de datos en c++
Turno derecho y entero con signo (5)
En mi compilador, el siguiente pseudo código (valores reemplazados con binario):
sint32 word = (10000000 00000000 00000000 00000000);
word >>= 16;
produce una word
con un campo de bits que se ve así:
(11111111 11111111 10000000 00000000)
Mi pregunta es, ¿puedo confiar en este comportamiento para todas las plataformas y compiladores de C ++?
Del último borrador de C ++ 20 :
El cambio a la derecha en tipos integrales con signo es un cambio a la derecha aritmética, que realiza la extensión de signo.
Desde el siguiente enlace:
INT34-C. No desplace 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 (cambio a la derecha)
El resultado de E1 >> E2
es E1
posiciones de bit E2
desplazadas a la derecha. Si E1
tiene un tipo sin signo 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 / 2 E2 . Si E1
tiene un tipo con signo y un valor negativo, el valor resultante se define por la implementación y puede ser un desplazamiento aritmético (con signo):
o un cambio lógico (sin signo):
Este ejemplo de código no compatible no prueba si el operando derecho es mayor o igual que el ancho del operando izquierdo promovido, lo que permite un comportamiento indefinido.
unsigned int ui1;
unsigned int ui2;
unsigned int uresult;
/* Initialize ui1 and ui2 */
uresult = ui1 >> ui2;
Hacer suposiciones acerca de si un cambio a la derecha se implementa como un cambio aritmético (firmado) o un cambio lógico (sin signo) también puede conducir a vulnerabilidades. Ver recomendación INT13-C. Use operadores bitwise solo en operandos sin firmar .
En C ++, no. Es implementación y / o plataforma dependiente.
En algunos otros idiomas, sí. En Java, por ejemplo, el operador >> se define con precisión para rellenar siempre con el bit más a la izquierda (conservando así el signo). El operador >>> llena con 0s. Entonces, si desea un comportamiento confiable, una posible opción sería cambiar a un idioma diferente. (Aunque obviamente, esto puede no ser una opción dependiendo de sus circunstancias).
Los enteros AFAIK pueden representarse como magnitud de signo en c ++, en cuyo caso la extensión de signo se rellenaría con 0s. Así que no puedes confiar en esto.
No, no puedes confiar en este comportamiento. El desplazamiento a la derecha de las cantidades negativas (que supongo que se trata de su ejemplo) está definido por la implementación.