GNU/Linux >> Belajar Linux >  >> Linux

Nilai maksimum untuk time_t (struct timespec)

Karena orang-orang di sini menjawab bagaimana mengatur time_t maksimum nilai, dan membuat tebakan lebih lanjut tentang jenisnya, saya pikir saya akan menambahkan c++ cara melakukannya:

#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();

Saya tidak akan terlalu peduli tentang apa yang masuk ke dalam time_t , tetapi tentang apa yang masuk akal. Pada sistem apa pun yang pernah saya lihat, sebuah time_t dapat menyandikan rentang waktu di mana saja dari 63 tahun hingga 10 tahun (hampir semua sistem yang saya tahu menggunakan angka 64 bit sejak para jenius ini muncul dengan hal yang akan mengakhiri dunia Y2K pada tahun 1999, masih harus dilihat siapa yang akan melihat jauh lebih besar "peristiwa" ketika tahun 2038 berlalu).

Jika Anda berharap secara wajar bahwa program Anda akan berjalan tidak lebih dari 50 tahun, tolak nilai apa pun yang lebih besar dari 50*365*86400, atau cukup penuhi nilainya. Saya tidak berharap salah satu program yang saya tulis sekarang akan digunakan dalam 50 tahun (walaupun saya tidak akan hidup untuk memverifikasi itu).
Di sisi lain, jika sistem Anda bisa gunakan time_t 32 bit , maka itu tidak masalah, karena waktu sistem akan meluap dalam 50 tahun, jadi seseorang tidak dapat membuat waktu yang berarti tanpa mengubah zaman.

Jika Anda bertanya "berapa lama Anda ingin menjeda?" dan pengguna mengatakan "250 tahun", saya akan menganggap itu bukan perilaku program yang benar-benar salah jika Anda mengatakan "ya benar, 50 juga akan berhasil". Karena, hei, perbedaannya benar-benar tidak terlihat.


Menurut Wikipedia, time_t mungkin bilangan bulat atau titik mengambang, tetapi biasanya berupa bilangan bulat bertanda 32-bit atau 64-bit. Saya pikir nilai aman terbesar yang dapat Anda asumsikan adalah INT_MAX . Untuk time_t setidaknya angka negatif adalah legal dan merujuk sebelum 1 Januari 1970.


Sayangnya standar ISO C (saat ini C11) tidak menyediakan cara apapun untuk mendapatkan nilai maksimum time_t . Jadi, kecuali seseorang menggunakan alat seperti Autoconf yang memberikan informasi, seseorang perlu membuat beberapa asumsi.

Dengan asumsi bahwa time_t adalah tipe bilangan bulat tanpa bantalan bit (yang terjadi pada sebagian besar platform saat ini, jika tidak semua), yang mungkin dapat diambil:

(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1

yang merupakan nilai maksimum yang dapat diwakili untuk tipe bilangan bulat yang ditandatangani (tetapi fakta bahwa suatu nilai dapat diwakili dalam time_t tidak berarti didukung oleh sistem sebagai time_t nilai).

Seseorang mungkin juga ingin mendeteksi apakah time_t adalah tipe bilangan bulat. Standar ISO C menetapkan bahwa time_t adalah tipe nyata (Klausul 7.27.1). Menurut definisi, tipe sebenarnya adalah tipe bilangan bulat atau tipe mengambang nyata (float , double atau long double , dan mungkin lainnya ditambahkan dalam versi standar yang akan datang, sebagaimana disebutkan dalam Klausul 6.11.1). Jadi, jika time_t bukan tipe integer, itu harus tipe floating nyata. Akibatnya, seseorang dapat mendeteksi apakah time_t adalah tipe bilangan bulat dengan pengujian (time_t) 1 / 2 == 0 .

Catatan:Standar C tidak secara ketat mengharuskan (T) 1 / 2 itu berbeda dari 0 jika T adalah tipe mengambang, tetapi jika tidak demikian, saya menduga bahwa platform tersebut akan memiliki masalah serius dengan perhitungan titik-mengambang.


Linux
  1. Tutorial Perintah tipe Linux untuk Pemula (dengan Contoh)

  2. Tutorial Perintah Mengetik Dengan Contoh Untuk Pemula

  3. Bagaimana Menemukan Nilai Yang Valid Untuk Istilah Yang Digunakan Di Tmux?

  1. Bagaimana Cara Mengetik Kata Sandi Untuk Banyak Windows?

  2. Untuk apa time_t pada akhirnya menjadi typedef?

  3. Bagaimana Anda membedakan direktori hanya untuk file dari jenis tertentu?

  1. grep secara rekursif untuk jenis file tertentu di Linux

  2. copy_to_user() dan copy_from_user() untuk tipe data dasar

  3. Apa id partisi / tipe sistem file untuk UDF?