Mengapa integer yang ditandatangani digunakan untuk mewakili cap waktu? Ada awal yang jelas pada tahun 1970 yang direpresentasikan sebagai 0, jadi mengapa kita perlu angka sebelum itu? Apakah cap waktu negatif digunakan di mana saja?
Mengapa integer yang ditandatangani digunakan untuk mewakili cap waktu? Ada awal yang jelas pada tahun 1970 yang direpresentasikan sebagai 0, jadi mengapa kita perlu angka sebelum itu? Apakah cap waktu negatif digunakan di mana saja?
Jawaban:
Versi awal C tidak memiliki bilangan bulat yang tidak ditandatangani. (Beberapa programmer menggunakan pointer ketika mereka membutuhkan aritmatika unsigned.) Saya tidak tahu mana yang lebih dulu, time()
fungsi atau tipe unsigned, tapi saya menduga representasi dibuat sebelum tipe unsigned tersedia secara universal. Dan 2038 sudah cukup jauh di masa depan yang mungkin tidak perlu dikhawatirkan. Saya ragu banyak orang mengira Unix masih akan ada saat itu.
Keuntungan lain dari yang ditandatangani time_t
adalah bahwa memperluasnya menjadi 64 bit (yang sudah terjadi pada beberapa sistem) memungkinkan Anda mewakili waktu beberapa ratus miliar tahun ke depan tanpa kehilangan kemampuan untuk mewakili waktu sebelum tahun 1970. (Itulah mengapa saya menentang beralih ke 32-bit unsigned time_t
; kami memiliki cukup waktu untuk beralih ke 64 bit.)
time
Fungsi lebih tua dari zaman yang: Unix v1 (tahun 1971) dihitung dalam satuan 1 / 60th per detik, dari tengah malam pada 1971/01/01. Sudah diketahui bug bahwa “Pengguna yang berpikiran kronologis akan mencatat bahwa 2 ** 32 enam puluh asecond hanya sekitar 2,5 tahun.” unsigned
Diperkenalkan oleh K&R pada 1978 , jauh setelah era 1970 didirikan.
gmtime
dan localtime
maks pada tahun 2147483647 (dengan detik berikutnya setelah memberikan -2147483648 sebagai tahun). Jadi, untuk melewati 55 bit waktu seseorang harus memperbarui rutinitas output untuk menggunakan int 64-bit untuk tahun ini alih-alih int 32-bit yang tidak ditandatangani. Mudah-mudahan seseorang akan menangani bug itu dalam beberapa miliar tahun mendatang.
struct tm
jenis memiliki anggota tm_year
(mewakili tahun sejak 1900) yang bertipe int
. Sistem 64-bit dapat dengan mudah memiliki 64-bit time_t
, tetapi mereka biasanya memiliki 32-bit int
. (Jika char
8 bit dan int
64 bit, maka short
bisa 16 atau 32 bit, dan tidak akan ada tipe yang telah ditentukan untuk ukuran lainnya.) Tetapi time()
mungkin satu-satunya fungsi di dalamnya <time.h>
yang benar-benar memerlukan dukungan level sistem; Anda dapat menulis kode Anda sendiri untuk mengonversi time_t
nilai ke string yang dapat dibaca manusia.
Ini untuk mendukung cap waktu dan tanggal sebelum 1 Januari 1970.
time_t
harus hanya 32 bit; sudah 64 bit pada banyak sistem.
mktime()
fungsi kembali -1
jika terjadi kesalahan sehingga mungkin tidak mungkin untuk membedakan antara cap waktu yang benar sebelum 1970-01-01 dan ts kesalahan. Tanggal rupanya sebelum 1970-01-01 dilarang
1969-12-31 23:59:59 UTC
. Nilai negatif selain -1
tidak ambigu.
mktime()
panggilan gagal untuk mengatur errno
. (POSIX melakukannya.)