【问题标题】:Need clear idea about timespec structure需要对 timespec 结构有清晰的认识
【发布时间】:2014-02-05 08:55:37
【问题描述】:

在我的项目中,我使用struct timespec 如下

struct timespec start, end;
clock_gettime(CLOCK_REALTIME,&start);
/* Do something */
clock_gettime(CLOCK_REALTIME,&end);

它返回一个值为((((unsigned64)start.tv_sec) * ((unsigned64)(1000000000L))) + ((unsigned64)(start.tv_nsec))))

谁能告诉我们为什么我们使用unsigned64 格式并帮助我详细了解这个结构?我在研究中使用此代码来计算代码执行时间的纳秒精度

【问题讨论】:

    标签: c linux time gettime


    【解决方案1】:

    无符号 32 位类型(如现代平台上的 unsigned int)的最大值略高于 40 亿。如果您有 5 并将其乘以 10 亿(就像在问题中的代码中所做的那样),您将得到 50 亿的值,大于 32 位无符号类型中可以包含的值。输入 64 位类型,它可以容纳 很多 个更高的值(更准确地说是18446744073709551615,与只有 @987654323 的无符号 32 位最大值进行比较@)。


    顺便说一下,代码可以简化成这样

    start.tv_sec * 1000000000ULL + start.tv_nsec
    

    这种简化是可能的,因为编译器会根据需要自动将低精度类型和值转换为高精度。由于表达式中有 unsigned long long(这就是 ULL 的意思)字面值,因此表达式的其余部分也将转换为 unsigned long long,结果将是 unsigned long long 类型。

    【讨论】:

    • 如果我不使用 (unsigned64) 一次,我会收到错误消息并且构建不成功。我使用“ %lld ”可以吗?
    • 一些构建错误兄弟..我没有注意到它是什么..昨天一整天都在尝试并且很烦恼..
    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2016-01-11
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多