为什么time_t
方法返回的两个difftime( time_t t1, time_t t2)
之间的差异为double
?我不知道精度要求来自哪里。
答案 0 :(得分:2)
因为time_t
只是在标准中定义为arithmetic type capable of representing times
。
这就是关于它的所有内容。它不必是整数,也不必表示秒。它只能是十的倍数,或者它可能是浮点类型,能够表示分辨率为10 -43 秒的时间。
C99 7.23.1 Components of time
的引用(稍微解释):
声明的类型是
clock_t
和time_t
,它们是能够表示时间的算术类型。 clock_t和time_t中可表示的时间范围和精度是实现定义的。
因此盲目地计算时差的人:
delta = time_end - time_begin;
可能会发现他们的代码无法在所有平台上运行。
现在我不知道任何平台,自从纪元以来它不是一个简单的秒,但我之前被假设喜欢这样做,例如假设{{ 1}}到A
是连续的,而事实上,这不是必需的,并且在使用EBCDIC的大型机产品上不能很好地工作。并且,是的,他们在重中使用still尽管显然自60年代以来一直在死亡: - )
C99理由文件有这样的说法:
类型
Z
和clock_t
是算术运算,因为根据现有惯例,这些类型的值必须与-1(“不知道”指示)进行比较,适当演员。然而,标准没有定义这些类型的算术属性,以便允许实现在选择最适合其预期应用的范围,精度和表示方面具有最大的灵活性。表示不必是某个基本单位的计数;可以想象,实现可以将时间值的不同分量表示为整数类型的子字段。
答案 1 :(得分:1)
尽管普遍认为 - 并且实现 - 作为表示自某个时代开始以来的秒的整数类型,time_t
实际上并未正式定义,因此您无法使用difftime的结果如果它是time_t
。至于其他替代方案:int
在某些情况下太小(long
),long long
不可移植。
答案 2 :(得分:1)
可能是因为它是最通用的算术类型。如果基础time_t
支持它,它允许优于第二精度。
答案 3 :(得分:0)
这样做的原因是没有为类型time_t
定义算术运算,通过返回一个双重意味着你可以在计算中使用结果。
如果您在不安全的区域中相互添加两个time_t
值,则因为如果将time_t定义为unsigned int或普通int,则可能会导致不同的行为 - 具体取决于您的平台。