GNU/Linux >> Linux の 問題 >  >> Linux

time_t の最大値 (struct timespec)

ここの人が最大の time_t を設定する方法に答えているので 値、およびそのタイプについてさらに推測を行うと、 c++ を追加すると思いました 方法:

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

time_t に何が入るかはあまり気にしません 、しかし合理的なことについて。私が見たどのシステムでも、time_t 63 年から 10 年までのタイムスパンをエンコードできます (これらの天才が 1999 年に Y2K 世界の終わりを思いついたとき以来、私が知っているほとんどすべてのシステムは 64 ビットの数値を使用しています。 2038年が過ぎたときの「出来事」)

あなたが合理的に期待するなら プログラムの実行期間が 50 年以内であることを確認するか、50*365*86400 を超える値を拒否するか、単純に値を飽和させます。私が現在書いているプログラムが 50 年後に使用されるとは思っていません (ただし、それを検証するために生きているわけではありません)。
一方、システムが そう 32 ビットの time_t を使用する いずれにせよ、システム時間は 50 年でオーバーフローするため、エポックをシフトせずに意味のある時間を構成することはできません。

「どのくらい休止しますか?」と聞かれたらユーザーが「250年」と言った場合、「そうです、50年もそうです」と言ったとしても、それは本当に間違ったプログラムの動作ではないと思います。なぜなら、違いは実際には観察できないからです.


ウィキペディアによると、time_t 整数または浮動小数点数の場合がありますが、通常は 32 ビットまたは 64 ビットの符号付き整数です。あなたが想定できる最大の安全な値は INT_MAX だと思います . time_t の場合 少なくとも負の数は合法であり、1970 年 1 月 1 日より前を参照します。


残念ながら、ISO C 標準 (現在の C11) は time_t の最大値を取得する方法を提供していません。 .したがって、情報を提供する Autoconf などのツールを使用しない限り、いくつかの仮定を行う必要があります。

time_t と仮定すると パディングビットのない整数型 (すべてではないにしても、最近のほとんどのプラットフォームでこれが当てはまります) の場合、おそらく次の値を取ることができます:

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

これは、符号付き整数型の表現可能な最大値です (ただし、値が time_t で表現可能であるという事実 time_t としてシステムでサポートされているという意味ではありません 値)

time_t かどうかを検出することもできます。 整数型です。 ISO C 標準では、time_t が指定されています。 は実数型です (7.27.1 節)。定義上、実数 整数型または 実数浮動小数点型 のいずれかです (floatdouble または long double 、および 6.11.1 節で言及されているように、標準の将来のバージョンで追加される可能性がある他のもの)。したがって、 time_t の場合 は整数型ではなく、必ず実浮動小数点型です。結果として、time_t かどうかを検出できます。 テスト (time_t) 1 / 2 == 0 の整数型です .

注:C 標準では、(T) 1 / 2 は厳密には要求されていません。 T の場合は 0 とは異なります は浮動小数点型ですが、そうでない場合、そのようなプラットフォームでは浮動小数点計算で深刻な問題が発生するのではないかと思います.


Linux
  1. 初心者向けの例を含むタイプコマンドチュートリアル

  2. コマンド単一引数の最大サイズを定義するものは何ですか?

  3. Tmuxで使用する用語の有効な値を見つける方法は?

  1. 初心者向けのLinuxタイプのコマンドチュートリアル(例付き)

  2. 複数のウィンドウのパスワードを入力する方法は?

  3. 単一のコマンドに対してBashでエイリアスを無効にする方法は??

  1. LinuxでMimeタイプのアプリケーションを見つける方法は?

  2. Dconfでキーまたは値を検索する方法は?

  3. time_t は最終的に typedef とは何ですか?