¿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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta