Почему функция `strtoll` дает неправильное значение и устанавливает для errno значение 34?

Вот мой код C:

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

Я скомпилировал его с помощью gcc-8.3.0, и вывод:

9223372036854775807
errno: 34

Меня смущает, что strtoll дает неожиданное значение и устанавливает для errno значение 34.


person Sean    schedule 23.03.2020    source источник
comment
В таких случаях первым шагом должен быть вызов perror или strerror и/или поиск кода ошибки.   -  person Konrad Rudolph    schedule 23.03.2020
comment
Вызов printf("%lld\n", value); может обмануть errno.   -  person Andrew Henle    schedule 23.03.2020
comment
@AndrewHenle Правда, лучше сначала позвонить printf("errno: %d\n", errno);.   -  person chux - Reinstate Monica    schedule 23.03.2020


Ответы (1)


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

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

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

person M.M    schedule 23.03.2020