Как думаете, чем конвертировать шестнадцатиричную строку в 32-х битное знаковое целое? Порывшись в стандарной библиотеке можно найти функцию
strtol. И все работает обычно... до тех пор пока входные данные беззнаковые. Попробуйте конвертировать -1 (0xFFFFFFFF) и ничего не выйдет.
strtol решит, что было переполнение и вернет
MAX_LONG. Чтобы обойти эту особенность, следует использовать функцию
strtoul. Она конвертит строку в беззнаковое целое, а уж потом можно его приравнять к long и старший бит укажет знак.
Пример:
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
string s = "FFFFFFFF";
char * p;
long n = strtoul( s.c_str(), &p, 16 );
// overflow when using long n = strtol( s.c_str(), &p, 16 );
if ( * p != 0 ) {
cout << "not a number" << endl;
} else {
cout << n << endl; // prints -1
}
}