tipos sintaxis rangos que programacion float declaracion datos c++ bit-shift platform-specific

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.