time_t
为什么方法返回的两个 s之间的差异difftime( time_t t1, time_t t2)
是 a double
?我看不出精度要求从何而来。
4 回答
因为time_t
在标准中简单地定义为arithmetic type capable of representing times
.
这就是它所说的一切。它不必是整数,也不必代表秒。它只能是 10 的倍数,或者它可能是能够表示时间的浮点类型,分辨率低至 10 -43秒。
引文C99 7.23.1 Components of time
是(稍微转述):
声明的类型是
clock_t
和time_t
,它们是能够表示时间的算术类型。clock_t 和 time_t 中可表示的时间范围和精度是实现定义的。
因此,盲目计算时差的人:
delta = time_end - time_begin;
可能会发现他们的代码并不适用于所有平台。
现在,我不知道任何平台自纪元以来都不是简单的几秒钟,但我之前一直被这样的假设所困扰,例如假设A
throughZ
是连续的,而事实上,这不是必需的并且在使用 EBCDIC 的大型机产品上效果不佳。而且,是的,尽管自 60 年代以来显然已经死亡,但它们仍在大量使用:-)
C99 基本原理文件有这样的说法:
类型
clock_t
和time_t
是算术的,因为根据现有实践,这些类型的值有时必须与 -1(“不知道”指示)进行比较,并进行适当的转换。然而,标准没有定义这些类型的算术属性,以便实现在选择最适合其预期应用的范围、精度和表示方面具有最大的灵活性。表示不必是某个基本单位的计数;一个实现可以想象将时间值的不同组件表示为整数类型的子字段。
尽管被普遍认为 - 并实现 - 作为表示自某个纪元开始以来的秒数的整数类型,time_t
但实际上并未正式定义为这样,因此如果 difftime 的结果是time_t
. 至于其他选择:int
在某些情况下太小(原样long
)并且long long
不可移植。
可能是因为它是最通用的算术类型。如果底层time_t
支持它,它允许比第二精度更好。
这样做的原因是没有为 type 定义算术运算time_t
,通过返回一个 double 意味着您可以在计算中使用结果。
IOW 如果您将两个time_t
值彼此相加,则您处于不安全的区域,因为如果 time_t 被定义为 unsigned int 或普通 int - 取决于您的平台,可能会导致不同的行为。