![](/img/trans.png)
[英]C: qsort has a problem sorting unsigned long long members of a structure
[英]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的机器上溢出。
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.