Как безопасно выполнить static_cast между unsigned int и int?

У меня есть 8-символьная строка , представляющая шестнадцатеричное число, и мне нужно преобразовать ее в int . Это преобразование должно сохранить битовый шаблон для строк , «80000000» и выше, т.е. эти числа должны быть отрицательными. К сожалению, наивное решение:

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

не работает для моего компилятора, если val> MAX_INT (возвращаемое значение - 0). Изменение типа val на int также приводит к 0 для больших чисел. Я пробовал несколько разных решений из разных ответов здесь, на SO, и еще не добился успеха.

Вот что я знаю:

  • Я использую компилятор HP C ++ для OpenVMS (с использованием, как мне кажется, процессора Itanium).
  • sizeof (int) будет как минимум 4 на каждой архитектуре, на которой будет работать мой код.
  • Преобразование числа> INT_MAX в int определяется реализацией. На моей машине это обычно приводит к 0, но любопытно, что приведение от long к int приводит к INT_MAX , когда значение слишком велико.

Это на удивление сложно сделать правильно, по крайней мере, для меня. Кто-нибудь знает о портативном решении этой проблемы?

Обновление:

Изменение static_cast на reinterpret_cast приводит к ошибке компилятора.Комментарий побудил меня попробовать приведение в стиле C: return (int) val в приведенном выше коде, и это сработало. На этой машине. Будет ли это безопасно на других архитектурах?

11
задан Michael Kristofik 29 September 2011 в 18:57
поделиться