GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Maximalwerte für time_t (struct timepec)

Da die Leute hier antworten, wie man den maximalen time_t einstellt -Wert und weitere Vermutungen über seinen Typ anzustellen, dachte ich, ich würde die c++ hinzufügen Vorgehensweise:

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

Ich würde mich nicht so sehr darum kümmern, was in eine time_t kommt , sondern darüber, was vernünftig ist. Auf jedem System, das ich gesehen habe, ein time_t kann Zeitspannen zwischen 63 und 10 Jahren kodieren (so ziemlich jedes System, das ich kenne, verwendet 64-Bit-Zahlen, seit diese Genies 1999 das Jahr-2000-Weltuntergangsding erfunden haben, bleibt abzuwarten, wer das viel größere bemerken wird "Ereignis", wenn das Jahr 2038 vorbei ist).

Wenn Sie vernünftigerweise erwarten dass Ihr Programm nicht länger als 50 Jahre läuft, lehnen Sie jeden Wert ab, der größer als 50*365*86400 ist, oder sättigen Sie einfach den Wert. Ich erwarte nicht, dass eines der Programme, die ich jetzt schreibe, in 50 Jahren verwendet wird (obwohl ich das nicht mehr erleben werde).
Andererseits, wenn Ihr System das tut Verwenden Sie ein 32-Bit-time_t , dann ist es sowieso egal, denn die Systemzeit wird so oder so in 50 Jahren übergelaufen sein, also kann man ohne Epochenwechsel sowieso keine sinnvolle Zeit konstruieren.

Wenn Sie fragen "Wie lange möchten Sie pausieren?" und der Benutzer "250 Jahre" sagt, würde ich es nicht wirklich für ein falsches Programmverhalten halten, wenn Sie sagen "ja richtig, 50 reichen auch". Denn, hey, der Unterschied ist wirklich nicht wahrnehmbar.


Laut Wikipedia time_t kann eine Ganzzahl oder Gleitkommazahl sein, ist aber normalerweise eine 32-Bit- oder 64-Bit-Ganzzahl mit Vorzeichen. Ich denke, der größte sichere Wert, den Sie annehmen können, ist INT_MAX . Für time_t zumindest negative Zahlen sind legal und beziehen sich auf die Zeit vor dem 1. Januar 1970.


Leider sieht der ISO-C-Standard (derzeit C11) keine Möglichkeit vor, den Maximalwert von time_t zu erreichen . Wenn man also keine Tools wie Autoconf verwendet, die Informationen liefern, muss man einige Annahmen treffen.

Angenommen, time_t ein Integer-Typ ohne Füllbits ist (was heutzutage auf den meisten Plattformen der Fall ist, wenn nicht auf allen), kann man wahrscheinlich nehmen:

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

was der maximal darstellbare Wert für einen vorzeichenbehafteten Integer-Typ ist (aber die Tatsache, dass ein Wert in time_t darstellbar ist bedeutet nicht, dass es vom System als time_t unterstützt wird Wert).

Man möchte vielleicht auch erkennen, ob time_t ist ein ganzzahliger Typ. Der ISO-C-Standard legt fest, dass time_t ein reeller Typ ist (Abschnitt 7.27.1). Per Definition ein echter Typ ist entweder ein Integer-Typ oder ein echter Floating-Typ (float , double oder long double , und möglicherweise andere, die in zukünftigen Versionen des Standards hinzugefügt werden, wie in Abschnitt 6.11.1 erwähnt). Wenn also time_t ist kein Integer-Typ, es ist notwendigerweise ein echter Floating-Typ. Als Folge kann man erkennen, ob time_t ist ein ganzzahliger Typ mit dem Test (time_t) 1 / 2 == 0 .

Hinweis:Der C-Standard verlangt nicht unbedingt, dass (T) 1 / 2 von 0 verschieden sein, wenn T ist ein Floating-Typ, aber wenn dies nicht der Fall ist, vermute ich, dass solche Plattformen ernsthafte Probleme mit Floating-Point-Berechnungen haben würden.


Linux
  1. Das Type Command Tutorial mit Beispielen für Anfänger

  2. Was definiert die maximale Größe für ein einzelnes Befehlsargument?

  3. Wie finde ich die gültigen Werte für den Begriff, der in Tmux verwendet werden soll?

  4. Wie gebe ich ein Passwort für mehrere Windows ein?

  5. Was ist time_t letztendlich ein Typedef?

Holen Sie sich Helm-Werte für eine Helm-Version

Formatierungsstruktur Zeitangabe

Konvertieren Sie Millisekunden in eine Zeitangabe für die GNU-Portierung

Was ist die Partitions-ID / der Dateisystemtyp für UDF?

Gültige Werte für LC_CTYPE?

df zeigt negative Werte für used?