¿Cómo se realiza una static_cast segura entre int y unsigned?
Tengo un @ de 8 caracterstring
que representa un número hexadecimal y necesito convertirlo en unint
. Esta conversión tiene que preservar el patrón de bits para cadenas"80000000"
y superior, es decir, esos números deberían salir negativos. Desafortunadamente, la solución ingenua:
int hex_str_to_int(const string hexStr)
{
stringstream strm;
strm << hex << hexStr;
unsigned int val = 0;
strm >> val;
return static_cast<int>(val);
}
no funciona para mi compilador sival > MAX_INT
(el valor devuelto es 0). Cambiar el tipo de val aint
también da como resultado un 0 para los números más grandes. He probado varias soluciones diferentes de varias respuestas aquí en SO y aún no he tenido éxito.
Esto es lo que sé:
Estoy usando el compilador C ++ de HP en OpenVMS (usando, creo, un procesador Itanium).sizeof(int)
será al menos 4 en cada arquitectura en la que se ejecutará mi código.Casting de un número> INT_MAX a int está definido por la implementación. En mi máquina, usualmente resulta en un 0 pero curiosamente emitido desdelong
aint
resulta enINT_MAX
cuando el valor es demasiado grande.Esto es sorprendentemente difícil de hacer correctamente, o al menos lo ha sido para mí. ¿Alguien sabe de unportáti solución a esto?
Actualizar
Cambiandostatic_cast
areinterpret_cast
da como resultado un error del compilador. Un comentario me llevó a probar un elenco de estilo C:return (int)val
en el código anterior, y funcionó. @En esta máquina. ¿Eso seguirá siendo seguro en otras arquitecturas?