Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用unsigned long for timeval成员是否有好处?_C_Unix_Time_Unsigned_Timeval - Fatal编程技术网

C 使用unsigned long for timeval成员是否有好处?

C 使用unsigned long for timeval成员是否有好处?,c,unix,time,unsigned,timeval,C,Unix,Time,Unsigned,Timeval,我注意到一些程序员使用unsigned long表示timeval的tv_sec和tv_usec[当他们复制或操作它们时],而它们被定义为简单的long 虽然这确实让我想知道,为什么在时间通常向前的时候,它们被定义为这样。当unix时间被发明时,负面时间可能是有意义的。比如,AT&T需要为20世纪60年代发生的事情设置足够的时间戳 至于微秒,如果你减去两个值,你可以用有符号的值变成负数,用无符号的值变成4+十亿。与0相比似乎更直观 对这些变量使用long int将一直有效,之后tv_sec将在l

我注意到一些程序员使用unsigned long表示timeval的tv_sec和tv_usec[当他们复制或操作它们时],而它们被定义为简单的long


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

当unix时间被发明时,负面时间可能是有意义的。比如,AT&T需要为20世纪60年代发生的事情设置足够的时间戳


至于微秒,如果你减去两个值,你可以用有符号的值变成负数,用无符号的值变成4+十亿。与0相比似乎更直观

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

标题应定义至少包括以下成员的timeval结构:
时间-电视秒-秒。
秒电视用微秒。
您应该注意到,使用的是
time\u t
类型,而不是
long
,但在某些系统上也是32位表示,而在其他系统上甚至有64位表示。为了避免溢出,
time\u t
可能会更改为无符号32位整数或64位整数


这就是为什么有些人使用无符号长码,因为它将在2100年之前阻止溢出。你应该改用
time\t
类型,这样你就不需要考虑你的程序在将来应该运行多长时间了。

tv\u sec
有type
time\t
tv_usec
的类型为
long
,需要签名,因为在减去
timeval
值以计算时间间隔时,您(平均50%的时间)将在
tv_usec
中得到负面结果,您必须检测到这一点并将其转换为
tv_sec
字段中的借用。标准(POSIX)本可以让类型不带符号,并要求您提前检测包装,但它没有,可能是因为这样会更难使用,并且与现有实践相矛盾


就范围而言,
tv\u usec
也没有理由不带符号,因为它真正需要表示的最大范围是-9999999到1999998(或者如果你想在重新规范化之前累积几个加法/减法的次数)。

我不同意这个理由(使用无符号值将Y2038问题延迟到2100年)。到2038年,所有机器将具有64位(或更大)
long
问题就会解决。@R..并不是所有嵌入式和旧式系统都会有这个问题。安全总比遗憾好。
time\u t
在所有Unix系统上都是
long
,在64位Unix系统上是64位宽的,所以在实践中它永远不会溢出。28年是很长的时间,大约占到目前为止Unix使用寿命的70%。@Philipp:Unix不需要
time\t
成为
long
。它可以是
long
。不幸的是,对于大多数人来说,二进制软件兼容性比修复遗留限制更为重要,所以在实践中,我们在32位机器上只能使用32位
time\t
。显然,对于任何新开发的机器来说,时间都会升级发布时间为2038+。是时候了。也就是说,对于任何旨在使用桌面用户,甚至是拥有自己工作站的业务用户的操作系统来说都没有问题。除非一个操作系统的目标是真正的遗留设备,否则不使用标准方法是丑陋的。你确定吗?我的理解是
(时间)-1
始终是一个错误指示器,在这种情况下,使用负时间值似乎是可疑的…时间(2)如果指定用于返回结果的指针,则只能返回错误,这意味着返回值只是一个成功指示器。Gettimeofday不返回开始时的时间。也就是说,FreeBSD的主页专门警告-1。
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.