Время как целое число со знаком - PullRequest
1 голос
/ 30 января 2011

Я читал о проблеме Y2038 и понимаю, что time_t в конечном итоге вернется к наименьшему представимому отрицательному числу, потому что попытается "увеличить" бит знака. *

Согласно этой странице Википедии, изменение time_t на целое число без знака не может быть выполнено, потому что это сломало бы программы, которые обрабатывают ранние даты. (Что имеет смысл.)

Тем не менее, я не понимаю, почему это не было сделано беззнаковое целое во-первых. Почему бы не хранить 1 января 1970 года как ноль, а не какое-нибудь нелепое отрицательное число?

Ответы [ 3 ]

5 голосов
/ 30 января 2011

Поскольку запуск его со знака -2,247,483,648 эквивалентен запуску без знака 0. Он не меняет диапазон значений, которые может содержать 32-разрядное целое число - 32-разрядное целое может содержать 4,294,967,296 различных состояний.Проблема не в отправной точке, проблема в максимальном значении, которое может содержать целое число.Единственный способ смягчить проблему - это обновить до 64-битных целых чисел.

Также (как я только что понял): 1970 был установлен как 0, так что мы могли бы вернуться назад во времени.(в то время было достаточно вернуться к 1901 году).Если бы они пошли без подписи, эпоха началась бы в 1901 году, чтобы иметь возможность вернуться назад с 1970 года, и у нас снова возникла бы та же проблема.

2 голосов
/ 30 января 2011

Здесь есть более фундаментальная проблема, чем использование значений без знака. Если бы мы использовали значения без знака, то мы получили бы только еще один бит хронометража. Это имело бы определенно положительное влияние - это удвоило бы количество времени, которое мы могли бы сохранить, - но тогда у нас будет проблема намного позже в будущем. В целом, для любого целочисленного значения с фиксированной точностью у нас будет проблема в этом направлении.

Когда UNIX разрабатывался в 1970-х годах, наличие 60-летних часов звучало нормально, хотя очевидно, что 120-летние часы были бы лучше. Если бы они использовали больше битов, то у нас были бы гораздо более длинные часы - скажем, 1000 лет - но по прошествии этого времени мы вернулись бы в прежнее русло и, вероятно, вспомнили бы и сказали «почему они не использовать больше битов? "

0 голосов
/ 30 января 2011

Потому что не все системы должны иметь дело исключительно с «прошлыми» и «будущими» значениями.Даже в 70-х годах, когда был создан Unix и была определена система времени, им приходилось иметь дело с датами 60-х или ранее.Итак, целое число со знаком имело смысл.

Когда все перейдут на 64-битные time_t, нам не придется беспокоиться о проблеме типа y2038k в течение еще 2 миллиардов или около того 136-летних периодов.

...