Unix neden zaman damgalarını işaretli bir tamsayıda saklıyor?


24

Zaman damgasını göstermek için neden işaretli bir tam sayı kullanılıyor? 1970'de 0 olarak gösterilen açık bir şekilde tanımlanmış bir başlangıç ​​var, o zaman neden ondan önce sayılara ihtiyacımız olsun? Negatif zaman damgaları herhangi bir yerde kullanılıyor mu?


2
Bu yüzden Nostradamus, 3000 + yıllara ilişkin tahminlerini yazmak için bilgisayarını kullanamadı ... taşması ve tarihlerini olumsuz olarak göstermesi gerekirdi. Bence Y3K böceği ya da başka bir şey dediler!
Jeach

3
Eski Romalılar, yıl sayıları olumsuzdan artıya doğru değiştiğinde daha da kötü bir problem yaşadılar. Sıfır sayısını ifade etmenin bir yolu olsa, bunu Y0K sorunu olarak adlandırırlardı. 8-)}
Keith Thompson,

Yanıtlar:


35

C'nin ilk sürümlerinde işaretsiz tamsayılar yoktu. (Bazı programcılar işaretsiz aritmetik gerektiğinde işaretçiler kullanırlardı.) Hangisinin ilk geldiğini, time()işlevi veya işaretsiz türleri bilmiyorum , ancak imzasız türler evrensel olarak mevcut olmadan önce temsilciliğin kurulduğundan şüpheleniyorum. Ve 2038 gelecekte muhtemelen endişelenmeye değmeyecek kadar uzundu. Birçok insanın Unix'in hala var olacağını düşündüğünden şüpheliyim.

Bir imzanın bir başka avantajı da time_tonu 64 bit'e (ki bazı sistemlerde zaten oluyor) genişletmek, 1970'den önceki zamanları temsil etme yeteneğini kaybetmeden, geleceğe birkaç yüz milyar yıl boyunca süre tanımanıza izin vermesidir. (Bu yüzden, 32-bit işaretsiz time_t , 64 bite geçiş yapmak için yeterli zamanımız var.)


7
timeFonksiyon çağında daha eski: Unix v1 1971/01/01 gece yarısından itibaren bir saniyenin 1 / 60. birimler sayıldı (1971). Zaten bir oldu - “fikirli kullanıcı asecond 2 ** 32/60 yalnızca yaklaşık 2,5 yıl olduğuna dikkat edecektir. Kronolojik” diye bilinen böcek unsigned tarafından tanıtıldı 1978 yılında K & R 1970 dönem kuruldu de sonra.
Gilles 'SO- kötülükten vazgeç'

Hızlı bir test yaptım ve 64-bit linux kutuma. gmtimeve localtime2147483647 yılında maksimuma çıkar (yıl olarak -2147483648 verildikten sonraki saniye ile). Bu yüzden, 55 bit zamanın çok ötesine geçebilmek için, birisinin imzasız bir 32 bit int yerine yıl için 64 bit int kullanmak için çıktı yordamını güncellemesi gerekir. İnşallah birileri önümüzdeki birkaç milyar yıl içinde bu hatayı halledecek.
freiheit

@freiheit: İlginç. Buradaki sorun, struct tmtürün tm_year(1900'den beri yılları temsil eden) türden bir üyesi olması int. 64 bit sistemler kolayca 64 bit olabilir time_t, ancak genellikle 32 bit olurlar int. ( char8 bit ve int64 bit ise, o shortzaman 16 veya 32 bit olabilir ve diğer boyut için önceden tanımlanmış bir tür olmayacaktır.) Ancak time(), muhtemelen <time.h>sistem düzeyinde destek gerektiren tek işlev budur; time_tdeğerleri insan tarafından okunabilen dizgelere dönüştürmek için kendi kodunuzu yazabilirsiniz .
Keith Thompson,

12

1 Ocak 1970’ten önceki zaman damgalarını ve tarihleri ​​desteklemektir.


1
Bu geçmişte sadece 68 yıl yapar - 1902. Bu oldukça az görünüyor.
Bakudan

2
POSIX time_tsadece 32 bit olmak zorunda değildir ; zaten birçok sistemde 64 bit.
Keith Thompson

1
mktime()işlev -1hata durumunda geri döner , bu nedenle 1970-01-01'den önce doğru zaman damgaları ile hata ts arasında ayrım yapmak imkansızdır. 1970-01-01 tarihinden önce görünür tarihler yasaktır
DimG

@DimG: Bir hatayı ve belirli bir zaman damgasını ayırt etmek zor 1969-12-31 23:59:59 UTC. -1Dışında bir negatif değer belirsizdir.
Keith Thompson

1
@mtraceur: C standardı mktime()ayarlamak için başarısız bir çağrı gerektirmez errno. (POSIX yapar.)
Keith Thompson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.