Почему бы нам не использовать полные 32 бита для хранения 136 лет со времен эпохи?
Я видел это много раз, например, в UNIX, в метках времени MySQL и т. Д. Эпоха начинается в 1970-1-1, но максимальный год записи 2038. Теперь давайте посчитаем:
2^32/60/60/24/365+1970
2106
Так что, если бы мы использовали полные 32 бита, мы бы без проблем добрались до 2106 года. Но, по-видимому, 2038 год соответствует только 31 биту. Так почему же мы выбрасываем один бит? Используя полные 32 бита, мы можем надеяться, что нам не придется решать проблему, так как мы, вероятно, сначала уничтожим Землю...
Реакция на комментарии: конечно, это потому, что она подписана, но зачем вообще ставить метку времени? В этом смысл этого вопроса.
2 ответа
Это может звучать безумно, но люди могут захотеть представлять даты до 1970 года. Переключение интерпретации классического time_t
ценность не вызовет ничего, кроме неприятностей.
Проблему 2038 можно обойти, переключившись на 64-битное представление с той же спецификацией. Как именно это должно быть сделано, подлежит обсуждению, так как возможность представлять даты в миллиардах лет в будущем имеет сомнительную ценность, когда эту точность можно использовать для представления подсекундных времен, но наивное решение работает лучше, чем ничего.
Краткий ответ: мы используем значение со знаком, потому что это стандарт.
Вероятно, это относится к категории "почему time_t подписано, а не подписано", и в этом случае вам может быть интересно услышать причину этого здесь:
Первоначально возникли споры о том, должен ли Unix time_t быть подписанным или неподписанным. Если без знака, его диапазон в будущем будет удвоен, отложив 32-битное переполнение (на 68 лет). Однако тогда он был бы неспособен представлять времена до 1970 года. Когда его спросили об этом вопросе, Деннис Ритчи сказал, что не очень задумывался об этом, но считал, что способность представлять все время в течение своей жизни было бы здорово. (Ритчи родился в 1941 году, время в Unix -893 400 000.) Консенсус заключается в том, что time_t должно быть подписано, и это обычная практика. Платформа разработки программного обеспечения для версии 6 операционной системы QNX имеет неподписанный 32-битный time_t, хотя в более ранних выпусках использовался подписанный тип.