Из реализации glibc мы читаем:
Мы ограничиваем размер года, который может быть напечатан.При использовании спецификатора формата% d добавление 1900 переполняет число и выводится отрицательное значение.В некоторых архитектурах мы могли бы теоретически использовать% ld или более широкий целочисленный формат, но это означало бы, что для вывода требуется больше места.Это не будет проблемой, если интерфейс 'asctime_r' будет определен разумно и размер буфера будет передан.
Запустите программу ниже, чтобы найти точное ограничение на вашем компьютере.
#include <limits.h>
#include <stdio.h>
#include <time.h>
/**
* Find the largest time_t for which ctime returns a non-NULL value
* using a bsearch between 0 and LONG_MAX.
**/
static time_t ctime_max() {
time_t start = 0, end = LONG_MAX, mid;
while (start < end) {
mid = start + (end - start) / 2;
if (ctime(&mid)) {
/* this mid is ctime-able; try higher */
start = mid + 1;
} else {
/* this mid is not ctime-able; try lower */
end = mid;
}
}
/* mid is now the lowest number that's too high; subtract one */
return mid - 1;
}
int main() {
time_t t = ctime_max();
printf("%s", ctime(&t));
return 0;
}
Для меня это выходит на Tue Dec 31 23:59:59 2147483647
, который является вторым до того, как год переполняет четыре подписанных байта.