我注意到有些程序员使用unsigned long来表示tv_sec和tv_usec [当他们复制或使用它们时] timeval,而它们被定义为很长。
虽然它确实让我想知道为什么他们在时间通常向前的时候被定义为。
答案 0 :(得分:4)
将long int
用于这些变量将一直有效year 2038,之后tv_sec
将在long
为4字节的机器上溢出。
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
类型而不是long
,但在某些系统上也是32位表示,而在其他系统上甚至有64位表示。为了避免溢出,time_t
可能会更改为无符号32位整数或64位整数。
这就是为什么有些人正在使用unsigned long
,因为它会在2100年以后停止溢出。你应该使用time_t
类型,而不需要考虑你的程序将来应该运行多长时间。
答案 1 :(得分:2)
当unix时间被发明时,负面时间可能是有意义的。就像,AT&amp; T需要足够的时间戳来解决20世纪60年代发生的事情。
对于微秒,如果你减去两个值,你可以使用带符号值进入负数,使用无符号进入4 + 10亿。与0比较似乎更直观。
答案 2 :(得分:1)
tv_sec
的类型为time_t
。 tv_usec
的类型为long
,需要进行签名,因为当您减去tv_usec
值来计算时,您{平均有50%的时间会在timeval
获得否定结果时间间隔,您必须检测到这一点并将其转换为tv_sec
字段的借位。标准(POSIX)可能会使类型无符号并要求您提前检测包装,但它没有,可能是因为这将更难使用并与现有实践相矛盾。
tv_usec
也没有理由在范围方面无条件,因为它真正需要能够表示的最大范围是-999999到1999998(或者如果你想积累的那么几倍)在重整化之前的几次加法/减法。)