Я пытаюсь выполнить преобразование шестнадцатеричных чисел в целочисленные на 32-битной машине. Вот код, который я тестирую,
int main(int argc,char **argv)
{
char *hexstring = "0xffff1234";
long int n;
fprintf(stdout, "Conversion results of string: %s\n", hexstring);
n = strtol(hexstring, (char**)0, 0); /* same as base = 16 */
fprintf(stdout, "strtol = %ld\n", n);
n = sscanf(hexstring, "%x", &n);
fprintf(stdout, "sscanf = %ld\n", n);
n = atol(hexstring);
fprintf(stdout, "atol = %ld\n", n);
fgetc(stdin);
return 0;
}
Вот что я получаю:
strtol = 2147483647 /* = 0x7fffffff -> overflow!! */
sscanf = 1 /* nevermind */
atol = 0 /* nevermind */
Как видите, с помощью strtol я получаю переполнение (я также проверял с помощью errno), хотя я ожидаю, что ничего не произойдет, поскольку 0xffff1234 является допустимым целочисленным 32-битным значением. Я бы либо ожидал 4294906420, либо -60876
Что мне не хватает?
strtol
пытается выяснить это самостоятельно с начала входной строки, использовать ли базу 16, 10 или 8. - person Daniel Fischer   schedule 24.07.2012