3

一部のプログラマーは、単にlongとして定義されているのに、timevalのtv_secおよびtv_usec[それらをコピーまたは操作するとき]にunsignedlongを使用していることに気付きました。

時間が経つにつれ、なぜそのように定義されたのか不思議に思いますが。

4

3 に答える 3

4

long intこれらの変数の使用は2038年まで機能し、その後は4バイトtv_secのマシンでオーバーフローしますlong

timevalは次のように定義されます。

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 long2100年以降までオーバーフローを停止するため、一部のユーザーがを使用しているのはそのためです。代わりにタイプを使用するtime_t必要があります。そうすれば、プログラムが将来どのくらいの期間実行されるかを考える必要はありません。

于 2010-12-19T12:41:06.517 に答える
2

UNIX時間が発明されたとき、負の時間はおそらく理にかなっています。同様に、AT&Tは、1960年代に起こったことに対して適切なタイムスタンプを必要としていました。

マイクロ秒に関しては、2つの値を引くと、符号付きの値では負の数になり、符号なしの場合は40億以上になります。0との比較はより直感的に思えます。

于 2010-12-19T12:33:16.550 に答える
2

tv_secタイプがありtime_tます。tv_usecはタイプであり、時間間隔を計算するために値を減算longすると(平均して50%の確率で)負の結果が得られるため、署名する必要があります。これを検出して、フィールドからの借用に変換する必要があります。標準(POSIX)では、代わりに型を符号なしにし、事前にラッピングを検出する必要がありましたが、おそらくそれは使いにくく、既存の慣行と矛盾するため、そうではありませんでした。tv_usectimevaltv_sec

tv_usecまた、実際に表現できる必要のある最大範囲は-999999〜1999998(または、再正規化する前に複数の加算/減算を累積する場合はその数倍)であるため、範囲ごとに符号なしにする理由はありません。

于 2010-12-19T14:27:10.743 に答える