【问题标题】:Representing the difference between time_t表示 time_t 之间的差异
【发布时间】:2012-03-31 22:05:48
【问题描述】:

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

【问题讨论】:

    标签: c++ time-t


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 从技术上讲,您对可移植性的看法是正确的,但是您是否碰巧知道 time_t 不能像大多数人习惯的那样工作的平台?
    • @John,我没有想到(请参阅更新),但我仍然希望尽可能多地编写可移植性代码。
    • 我完全支持便携性——我只是好奇。
    【解决方案2】:

    尽管被普遍认为 - 并实现 - 作为一个整数类型,表示自某个纪元开始以来的秒数,time_t 实际上并没有正式定义为这样,所以如果它,你不能便携地使用 difftime 的结果是time_t。至于其他替代方案:int 在某些情况下太小(long 也是如此),long long 不可移植。

    【讨论】:

      【解决方案3】:

      可能是因为它是最通用的算术类型。如果底层 time_t 支持它,它允许优于秒精度。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 2017-01-27
          • 2012-06-06
          • 2020-10-12
          • 1970-01-01
          • 2020-01-31
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多