1

time_t为什么方法返回的两个 s之间的差异difftime( time_t t1, time_t t2)是 a double?我看不出精度要求从何而来。

4

4 回答 4

2

因为time_t在标准中简单地定义为arithmetic type capable of representing times.

这就是它所说的一切。它不必是整数,也不必代表秒。它只能是 10 的倍数,或者它可能是能够表示时间的浮点类型,分辨率低至 10 -43秒。

引文C99 7.23.1 Components of time是(稍微转述):

声明的类型是clock_ttime_t,它们是能够表示时间的算术类型。clock_t 和 time_t 中可表示的时间范围和精度是实现定义的。

因此,盲目计算时差的人:

delta = time_end - time_begin;

可能会发现他们的代码并不适用于所有平台。

现在,我不知道任何平台自纪元以来都不是简单的几秒钟,但我之前一直被这样的假设所困扰例如假设AthroughZ是连续的,而事实上,这不是必需的并且在使用 EBCDIC 的大型机产品上效果不佳。而且,是的,尽管自 60 年代以来显然已经死亡,但它们仍在大量使用:-)

C99 基本原理文件有这样的说法:

类型clock_ttime_t是算术的,因为根据现有实践,这些类型的值有时必须与 -1(“不知道”指示)进行比较,并进行适当的转换。

然而,标准没有定义这些类型的算术属性,以便实现在选择最适合其预期应用的范围、精度和表示方面具有最大的灵活性。表示不必是某个基本单位的计数;一个实现可以想象将时间值的不同组件表示为整数类型的子字段。

于 2012-03-15T11:54:18.350 回答
1

尽管被普遍认为 - 并实现 - 作为表示自某个纪元开始以来的秒数的整数类型,time_t但实际上并未正式定义为这样,因此如果 difftime 的结果是time_t. 至于其他选择:int在某些情况下太小(原样long)并且long long不可移植。

于 2012-03-15T11:54:32.517 回答
1

可能是因为它是最通用的算术类型。如果底层time_t支持它,它允许比第二精度更好。

于 2012-03-15T12:09:26.350 回答
0

这样做的原因是没有为 type 定义算术运算time_t,通过返回一个 double 意味着您可以在计算中使用结果。

IOW 如果您将两个time_t值彼此相加,则您处于不安全的区域,因为如果 time_t 被定义为 unsigned int 或普通 int - 取决于您的平台,可能会导致不同的行为。

于 2012-03-15T11:53:28.927 回答