Comment peut-on static_cast entre unsigned int et int?

J'ai une de 8 caractères string représentant un nombre hexadécimal et j'ai besoin de le convertir en un int. Cette conversion a pour préserver le motif de bits pour les chaînes "80000000" et plus, c'est à dire, ces chiffres devraient sortir négatif. Malheureusement, la naïve solution:

int hex_str_to_int(const string hexStr)
{    
    stringstream strm;
    strm << hex << hexStr;
    unsigned int val = 0;
    strm >> val;
    return static_cast<int>(val);
}

ne fonctionne pas pour mon compilateur si val > MAX_INT (la valeur retournée est 0). Changer le type de val de int également les résultats dans un 0 pour le plus grand nombre. J'ai essayé plusieurs solutions différentes de différentes réponses ici sur DONC et n'ai pas réussi encore.

Voici ce que je sais:

  • Je suis en utilisant HP compilateur C++ sur OpenVMS (à l'aide, je crois, un processeur Itanium).
  • sizeof(int) sera d'au moins 4 sur chaque architecture de mon code s'exécute.
  • Coulée à partir d'un nombre > INT_MAX int la mise en œuvre est définie. Sur ma machine, elle se traduit généralement par un 0, mais il est intéressant de noter casting de long à int résultats dans INT_MAX lorsque la valeur est trop grande.

C'est étonnamment difficile de le faire correctement, ou du moins il l'a été pour moi. Personne ne sait d'une portable solution?

Mise à jour:

Changer static_cast à reinterpret_cast génère une erreur de compilation. Un commentaire qui m'a incité à essayer un style C cast: return (int)val dans le code ci-dessus, et cela a fonctionné. Sur cette machine. Volonté d'être toujours en sécurité sur d'autres architectures?

source d'informationauteur Michael Kristofik