Похоже, что long
в вашей системе является 32-битным значением. Это означает, что любое число без знака выше 4 294 967 295 не будет преобразовано правильно, а также числа со знаком выше 2 147 483 647 или ниже 2 147 483 648.
Как правило, n -битное представление может представлять числа со знаком в диапазоне [-2 n -1 , - 2 n -1 ) или числа без знака в диапазоне [0,2 n ).
Статья в Википедии Форматы компьютерной нумерации , вероятно, является хорошей отправной точкой, чтобы узнать больше об этом поведении.
Причина, по которой вы видите разные результаты от atol()
и strtol()
, заключается в том, что они имеют разные характеристики обработки ошибок. Из справочной страницы strtol()
:
Функция strtol()
возвращает результат преобразования, если только значение не будет уменьшено или переполнено. В случае недостаточного значения strtol()
возвращает LONG_MIN
. В случае переполнения strtol()
возвращает LONG_MAX
. В обоих случаях errno
устанавливается на ERANGE
.
И из atol()
справочной страницы :
Функция atoi()
преобразует начальную часть строки, на которую указывает nptr
, в int. Поведение такое же, как у
strtol(nptr, (char **)NULL, 10);
за исключением того, что atoi()
не обнаруживает ошибок.
Функции atol()
и atoll()
ведут себя так же, как atoi()
, за исключением того, что они преобразуют начальную часть строки в свою тип возврата long
или long long
.