Чому підписане ціле число використовується для представлення часових позначок? Є чітко визначений початок з 1970 року, який представлений як 0, тож навіщо нам потрібні цифри до цього? Чи використовуються де-небудь негативні позначки часу?
Чому підписане ціле число використовується для представлення часових позначок? Є чітко визначений початок з 1970 року, який представлений як 0, тож навіщо нам потрібні цифри до цього? Чи використовуються де-небудь негативні позначки часу?
Відповіді:
Ранні версії C не мали підписаних цілих чисел. (Деякі програмісти використовували покажчики тоді, коли їм потрібна непідписана арифметика.) Я не знаю, який був першим, time()
функція або неподписані типи, але я підозрюю, що представлення було встановлено до того, як неподписані типи були загальнодоступними. І 2038 рік був досить далеким у майбутньому, що його, мабуть, не варто було турбувати. Я сумніваюся, що багато людей думали, що Unix до цього часу ще існуватиме.
Ще одна перевага підписаного time_t
полягає в тому, що розширення його на 64 біти (що вже відбувається в деяких системах) дозволяє представляти кілька разів на кілька сотень мільярдів років у майбутнє, не втрачаючи можливості представляти часи до 1970 року. (Тому я проти того, щоб перейти на 32-розрядний без підпису time_t
; у нас є достатньо часу для переходу до 64 біт.)
time
функція є старшою за епоху: Unix v1 (1971 р.) Рахується в одиниці 1/60 секунди, починаючи з півночі 1971/01/01. Це було вже відомо , що помилка «Хронологічний - мислячих користувач помітить , що 2 ** 32/60 від asecond становить лише близько 2,5 років.» unsigned
Було введено K & R в 1978 році , а після 1970 епохи була створена.
gmtime
і localtime
максимум у році 2147483647 (з наступною секундою після дати -2147483648 як рік). Таким чином, щоб значно перевищити 55 біт часу, комусь доведеться оновити вихідну процедуру, щоб використовувати 64-бітний інт на рік замість непідписаного 32-бітного int. Сподіваємось, хтось подбає про цю помилку десь у найближчі пару мільярдів років.
struct tm
тип має член tm_year
(представляє роки з 1900 року), який є типом int
. 64-бітні системи можуть легко мати 64-розрядні time_t
, але вони, як правило, мають 32-розрядні int
. (Якщо char
8 біт і int
це 64 біт, то це short
може бути або 16, або 32 біт, і для іншого розміру не буде визначеного типу.) Але time()
, мабуть, єдина функція, <time.h>
яка дійсно вимагає підтримки на рівні системи; ви можете написати власний код, щоб перетворити time_t
значення в рядки, прочитані людиною.
Це підтримувати часові позначки та дати до 1 січня 1970 року.
time_t
лише 32 біт; це вже 64 біти для багатьох систем.
mktime()
функція повертається -1
у випадку помилки, тому, ймовірно, неможливо розрізнити правильні часові позначки до 1970-01-01 та помилки ts. Заборонені дати до 1970-01-01 заборонені
1969-12-31 23:59:59 UTC
. Негативне значення, відмінне від -1
однозначного.
mktime()
дзвінка errno
. (POSIX робить.)