【问题标题】:What primitive data type is time_t? [duplicate]time_t 是什么原始数据类型? [复制]
【发布时间】:2011-02-17 01:33:38
【问题描述】:

我不知道time_t 的数据类型。它是浮点双精度还是其他?因为如果我想显示它,我需要与它对应的标签printf。我可以从那里处理其余部分以显示time_t,但我需要知道与之对应的数据类型。

【问题讨论】:

  • 这里已经回答了:stackoverflow.com/questions/471248/…
  • 对于那些在这里搜索如何打印 time_t 的人,同样的讨论适用于 clock_t 并且已经完成here
  • @FirasAssaad 这个答案适用于 Linux。这篇文章与操作系统无关。

标签: c types printf time-t


【解决方案1】:

它是特定于平台的。但您可以将其强制转换为已知类型。

printf("%lld\n", (long long) time(NULL));

【讨论】:

  • 假设平台支持(long long)。正是在不需要的时候,您才需要知道 time_t 只是 32 位。
  • 它还假定long long 大到足以容纳该值。就标准而言,time_t 可以是自第一个 Monty Python 剧集播出以来的 yoctoseconds 数(这将使其大​​于 64 位)。
  • @skyking 没有说谎。您至少需要一个 111 位的数字来保存这样的值(大约 1.5e33)。在他们将long long long long 纳入标准之前,您可以通过将所有time_ts 存储在uint64_t[2] 中来为未来做准备。
【解决方案2】:

不幸的是,它不是完全可移植的。它通常是整数,但它can be 任何“整数或实浮点类型”。

【讨论】:

    【解决方案3】:

    您可以使用函数difftime。它返回两个给定的time_t 值之间的差,输出值为double(参见difftime documentation)。

    time_t actual_time;
    double actual_time_sec;
    actual_time = time(0);
    actual_time_sec = difftime(actual_time,0); 
    printf("%g",actual_time_sec);
    

    【讨论】:

      【解决方案4】:

      您总是可以使用 mktime 之类的东西来创建一个已知时间(午夜、昨晚),并使用 difftime 来获得两者之间的双精度时差。对于独立于平台的解决方案,除非您深入研究库的细节,否则您不会做得比这更好。根据 C 规范,time_t 的定义是实现定义的(这意味着库的每个实现都可以随意定义它,只要使用它的库函数按照规范行事。)

      话虽如此,我的 linux 机器上 time_t 的大小是 8 个字节,这表明它是 long int 或 double。所以我做了:

      int main()
      {
          for(;;)
          {
              printf ("%ld\n", time(NULL));
              printf ("%f\n", time(NULL));
              sleep(1);
          }
          return 0;
      }
      

      %ld 给定的时间每一步增加一,浮点数每次打印 0.000。如果您一心想使用 printf 来显示 time_ts,最好的办法是尝试自己的此类实验,看看它在您的平台和编译器上的效果如何。

      【讨论】:

      • 我知道你的评论是旧的,但你需要使用 printf ("%f\n", (double) time(NULL)); 因为 printf 是一个可变参数函数。
      猜你喜欢
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2016-08-16
      • 2012-08-25
      • 2014-07-06
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多