表示时间_t之间的差异

Representing the difference between time_t

本文关键字:之间 时间 表示      更新时间:2023-10-16

为什么difftime( time_t t1, time_t t2)方法返回的两个time_t之间的差异是double?我不知道精度要求是从哪里来的。

因为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;

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

现在,我根本不知道有哪个平台从新纪元开始就不是一个简单的秒,但我以前曾被类似的假设所困扰,比如假设AZ是连续的,而事实上,这不是必需的,在使用EBCDIC的大型机产品上也不太好用。而且,是的,尽管自60年代以来就已经死亡,但它们仍在大量使用:-)

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

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

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

尽管time_t被普遍认为并实现为表示某个纪元开始以来的秒数的积分类型,但它实际上并没有被正式定义为这样的类型,因此如果它是time_t,则无法方便地使用difftime的结果。至于其他选择:int在某些情况下太小(long也是如此),long long不可移植。

可能是因为它是最通用的算术类型。如果底层time_t支持它,它可以提供比秒更好的精度。

原因是没有为类型time_t定义算术运算,通过返回双精度意味着您可以在计算中使用结果。

IOW如果您将两个time_t值彼此相加,则您处于不安全区域,因为如果time_t被定义为无符号int或正常int,则可能会产生不同的行为,具体取决于您的平台。