对于timeval成员使用unsigned long有什么好处吗?

时间:2010-12-19 11:28:12

标签: c unix time unsigned timeval

我注意到有些程序员使用unsigned long来表示tv_sec和tv_usec [当他们复制或使用它们时] timeval,而它们被定义为很长。

虽然它确实让我想知道为什么他们在时间通常向前的时候被定义为。

3 个答案:

答案 0 :(得分:4)

long int用于这些变量将一直有效year 2038,之后tv_sec将在long为4字节的机器上溢出。

timeval shall be defined as:

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_ttv_usec的类型为long,需要进行签名,因为当您减去tv_usec值来计算时,您{平均有50%的时间会在timeval获得否定结果时间间隔,您必须检测到这一点并将其转换为tv_sec字段的借位。标准(POSIX)可能会使类型无符号并要求您提前检测包装,但它没有,可能是因为这将更难使用并与现有实践相矛盾。

tv_usec也没有理由在范围方面无条件,因为它真正需要能够表示的最大范围是-999999到1999998(或者如果你想积累的那么几倍)在重整化之前的几次加法/减法。)