Чому підписане ціле число використовується для представлення часових позначок? Є чітко визначений початок з 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. (Якщо char8 біт і 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 робить.)