Почему функция `strtoll` дает неправильное значение и устанавливает errno равным 34? - PullRequest
3 голосов
/ 23 марта 2020

Вот мой C код:

    char *ptr = "0xfff1342809062Cac";
    char *pEnd;
    long long value = strtoll(ptr, &pEnd, 0);
    printf("%lld\n", value);
    printf("errno: %d\n", errno);

Я скомпилировал его с помощью g cc -8.3.0, и получился вывод:

9223372036854775807
errno: 34

Я запутался этот strtoll дает неожиданное значение и устанавливает errno равным 34.

1 Ответ

8 голосов
/ 23 марта 2020

Это поведение правильно. В вашей системе максимальное значение для long long, то есть LLONG_MAX равно 9223372036854775807.

Значение в вашей строке больше, чем это; и указанное поведение, если значение выходит за пределы диапазона и слишком велико: return LLONG_MAX и errno установлены на ERANGE (предположительно 34 в вашей системе).

Возможно, рассмотрите возможность использования strtoull и unsigned long long возвращаемое значение, поскольку эта строка будет соответствовать этому типу данных.

...