time_t的最大值(struct timespec)

我正在使用struct timespec结构,这里是:

 struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds */ }; 

事情是,用户将input每个这些个人成员的价值观,我想把一个检查最大。 用户可以input的值。

我可以采取最大限度吗? time_t值作为int最大值? 即INT_MAXtv_secLONG_MAX (在limits.h中定义)为tv_nsec ? 两者的最小可接受值是多less? 它是零吗? 我猜负值不能被接受? 只要添加,这些值将在计时器中使用。

PS: time_t的typedef在哪里? 在time.h中找不到它。

time_t只是一个很长的int。
它在(在我的Ubuntu linux系统上)/usr/include/time.h中定义,然而定义一直延伸到/usr/include/bits/types.h,其中__SLONGWORD_TYPE (这是__TIME_T_TYPE被定义的)被定义为。

简单地检查一个值是否大于LONG_MAX是,一旦一个值超过这个值,它将自动回绕并变成负值。 因此,你不能检查是否有任何东西大于这个值 – 宏被定义为这个类型可以使用的最大值。

你不是真的想要一个用户输入这些值 – 除非通过“用户”你的意思是“开发人员”。 唯一真正的“安全”的方式来测试这将是让用户输入一个字符串(当然是c样式),然后运行两个检查:
1)检查用户输入的数字是否超过允许的数字(便宜的技巧是int(log10(number)) + 1来计算一个数字中的数字的数量)。
2)如果这等于数字的数量,则开始比较数字。 您可以使用一点模运算来逐位比较。

这确实是最安全的方式来检查用户是否输入一个太大的数字。 这种方式不会遇到任何溢出问题,尽管这非常乏味的。 希望这可以帮助。

由于这里的人正在回答如何设置最大time_t值,并进一步猜测它的类型,我想我会添加c++方式来做到这一点:

 #include <limits> ... time_t maxTime = std::numeric_limits<time_t>::max(); 

我不会在意什么是时间,而是关于什么是合理的。 在我看到的任何系统中, time_t都可以对63到10 11年间的时间段进行编码(几乎每个我知道的系统都使用64位数字,因为这些天才们在1999年提出了2000年世界末日的事情,当2038年过去时,谁将注意到更大的“事件”仍有待观察)。

如果您合理地期望您的程序运行时间不超过50年,拒绝大于50 * 365 * 86400的任何值,或者只是将该值饱和。 我不希望我现在写的任何程序在50年内被使用(虽然我不会去验证)。
另一方面,如果你的系统使用了32位的time_t ,那么无论如何也不重要,因为系统时间在50年之内都会翻倍,所以无论如何也不能构建一个有意义的时间。

如果你问“你想暂停多久?” 而用户说“250年”,如果你说“是的,50也会做”,我认为这不是真正的错误的程序行为。 因为,嘿,差别真的不可观察。

根据维基百科, time_t可能是一个整数或浮点数,但通常是一个32位或64位有符号整数。 我认为您可以假设的最大安全值是INT_MAX 。 对于time_t ,至少负数是合法的,并在1970年1月1日之前提及。

取自ISO / IEC 9899: TC3§7.23

  1. 声明的类型是size_t (在7.17中描述); clock_ttime_t ,它们是能够表示时间的算术类型; 和struct tm ,它包含一个日历时间的组成部分,称为分解时间。

  2. clock_ttime_t中表示的时间的范围和精度是实现定义的

因此,您不能根据C标准对其最大值进行任何假设。

如果你需要编写可移植的代码,你可能会使用autotols。 Autoconf提供了AC_CHECK_SIZEOF宏,可以帮助您处理体系结构特定的数据限制。

不幸的是,ISO C标准(目前是C11)没有提供任何方式来获得time_t的最大值。 因此,除非使用像Autoconf这样的工具来提供信息,否则需要做一些假设。

假设time_t是一个没有填充位的整型(现在大多数平台都是这种情况,如果不是全部的话),可以这样做:

 (((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1 

这是有符号整数类型的最大可表示值(但time_t中的值可表示的事实并不意味着它被系统支持为time_t值)。

人们也可能想要检测time_t是否是整数类型。 ISO C标准规定time_t是一个真正的类型(条款7.27.1)。 根据定义, 真实类型可以是整数类型,也可以是实际浮点类型浮点型double float long double float ,可能还有其他版本,如标准6.11.1所述)。 因此,如果time_t不是整数类型,它必然是一个真正的浮动类型。 因此,可以使用test (time_t) 1 / 2 == 0来检测time_t是否为整型。

注意:如果T是一个浮点类型,C标准并没有严格要求(T) 1 / 2等于0,但是如果不是这样的话,我怀疑这样的平台在浮点计算上会有严重的问题。