繁体   English   中英

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

[英]Is there a benefit in using unsigned long for timeval members?

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

虽然它确实让我想知道为什么当时间通常向前时它们被定义为那样。

对这些变量使用long int将一直工作到2038年 ,之后tv_sec将在long 4bytes的机器上溢出。

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类型是使用而不是long ,但在某些系统上也是32位表示,而在其他系统上甚至有64位表示。 为了避免溢出, time_t可能会更改为无符号32位整数或64位整数。

这就是为什么有些人使用unsigned long ,因为它将阻止溢出直到2100+年。 你应该使用time_t类型,而不需要考虑你的程序将来应该运行多长时间。

当unix时间被发明时,负面时间可能是有意义的。 就像,AT&T需要足够的时间戳来解决20世纪60年代发生的事情。

至于微秒,如果你减去两个值,你可以使用带符号的值进入负数,使用无符号进入4 + 10亿。 与0比较似乎更直观。

tv_sec类型为time_t tv_usec类型为long ,需要签名,因为当减去timeval值来计算时间间隔时,你会(平均50%的时间)在tv_usec得到负面结果,你必须检测到并将其转换为借位来自tv_sec字段。 标准(POSIX)可能会使类型无符号并要求您提前检测包装,但它没有,可能是因为这将更难使用并与现有实践相矛盾。

从范围来看, tv_usec也没有理由是无符号的,因为它真正需要能够表示的最大范围是-999999到1999998(或者如果你想在重新规范化之前积累几个加法/减法那么几倍) 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM