una conversión de tipos puede
mantener el valor conceptual (la bitpattern puede que ser cambiado), o
mantener el bitpattern (el valor conceptual puede tienen que estar cambiado).
El único molde C++ que garantiza siempre mantiene la bitpattern es const_cast
.
Un reinterpret_cast
es, como su nombre indica, la intención de mantener el bitpattern y simplemente reinterpretarlo. Pero el estándar permite una implementación muy amplia en cómo implementar reinterpret_cast
. En algunos casos, un reinterpret_cast
puede cambiar el patrón de bits.
A dynamic_cast
generalmente cambia tanto el patrón de bit como el valor, ya que generalmente profundiza en un objeto y devuelve un puntero/referencia a un subobjeto del tipo solicitado.
Un static_cast
puede cambiar el bitpattern tanto para los enteros y los punteros, pero , casi todos los ordenadores existentes usan una representación de enteros con signo (llamado complemento de dos), donde static_cast
no va a cambiar la bitpattern. En cuanto a los punteros, basta con decir que, por ejemplo, cuando una clase base no es polimórfico y una clase derivada es polimórfico, utilizando static_cast
para ir de puntero a derivado a puntero a la base, o viceversa, puede cambiar la bitpattern (como se puede ver al comparar los punteros void*
). Ahora, números enteros ...
Con n bits de valor, un tipo entero sin signo tiene 2^n valores, en el rango de 0 a 2^n -1 (inclusive).
El C++ estándar garantiza que cualquier resultado del tipo es envuelto en ese rango sumando o restando un múltiplo adecuado de 2^n .
En realidad así es como el estándar de C lo describe; estándar, el C++ sólo dice que las operaciones son modulo 2^n, que significa lo mismo.
Con de dos forma de complemento un valor con signo - x tiene el mismo bitpattern como el valor sin signo - x + 2^n . Es decir, el mismo patrón de bits que el estándar de C++ garantiza que obtiene mediante la conversión - x al tipo sin signo del mismo tamaño. Eso es lo básico simple de la forma de complemento a dos, que es precisamente la garantía lo que estás buscando. :-)
Y casi todos los ordenadores existentes usan forma de complemento a dos.
Por lo tanto, en la práctica, tiene la garantía de un bitpattern sin cambios para sus ejemplos.
De mi propia prueba en VS2008 static_cast (lUnsigned) no cambia los bits. –
Es un detalle de implementación de la representación entera subyacente. Hacer cualquier asunción de 2 cumplidos eventualmente te morderá el culo. –
Buen punto Martin. Sin embargo, tengo una complicación de que sé que mi valor es un número de complemento 2 firmado porque proviene del hardware, y debido a una biblioteca, el valor se almacena en un int sin firmar. ¡Solo quiero devolverlo a un tipo sensato! :) –