一部のプログラマーは、単にlongとして定義されているのに、timevalのtv_secおよびtv_usec[それらをコピーまたは操作するとき]にunsignedlongを使用していることに気付きました。
時間が経つにつれ、なぜそのように定義されたのか不思議に思いますが。
long int
これらの変数の使用は2038年まで機能し、その後は4バイトtv_sec
のマシンでオーバーフローしますlong
。
The <sys/time.h> header shall define the timeval structure that includes at least the following members:
time_t tv_sec Seconds.
suseconds_t tv_usec Microseconds.
time_t
の代わりにtypeが使用されていることに注意してくださいlong
。これは、一部のシステムでは32ビット表現であり、他のシステムでは64ビット表現ですらあります。オーバーフローを回避するために、time_t
おそらく符号なし32ビット整数または64ビット整数に変更されます。
unsigned long
2100年以降までオーバーフローを停止するため、一部のユーザーがを使用しているのはそのためです。代わりにタイプを使用するtime_t
必要があります。そうすれば、プログラムが将来どのくらいの期間実行されるかを考える必要はありません。
UNIX時間が発明されたとき、負の時間はおそらく理にかなっています。同様に、AT&Tは、1960年代に起こったことに対して適切なタイムスタンプを必要としていました。
マイクロ秒に関しては、2つの値を引くと、符号付きの値では負の数になり、符号なしの場合は40億以上になります。0との比較はより直感的に思えます。
tv_sec
タイプがありtime_t
ます。tv_usec
はタイプであり、時間間隔を計算するために値を減算long
すると(平均して50%の確率で)負の結果が得られるため、署名する必要があります。これを検出して、フィールドからの借用に変換する必要があります。標準(POSIX)では、代わりに型を符号なしにし、事前にラッピングを検出する必要がありましたが、おそらくそれは使いにくく、既存の慣行と矛盾するため、そうではありませんでした。tv_usec
timeval
tv_sec
tv_usec
また、実際に表現できる必要のある最大範囲は-999999〜1999998(または、再正規化する前に複数の加算/減算を累積する場合はその数倍)であるため、範囲ごとに符号なしにする理由はありません。