繁体   English   中英

C - uint64_t 的时间值

[英]C - timeval to uint64_t

早晨!

我正在尝试从 timeval 结构中获取纳秒时间戳(uint64_t)。

    struct timeval t;
    // initialized so that ....
    print("t sec: %ld, micro sec: %ld", t.tv_sec, t.tv_usec);
    // .... prints "t sec: 4, micro sec: 130728"

    long int sec = (long int) t.tv_sec;
    // just did that because I thought that using time_t in calculations may cause errors
    // print("%ld", sec) -> 4, so this seems to work as expected    

    uint64_t t_int = (sec * 1000000 + t.tv_usec) * 1000; // should be nanoseconds
    print("t_int (uint64_t) %llu", t_int);
    // prints "t_int (uint64_t) 18446744073545312320"

我的 timevals 绝对应该适合 uint64_t。 此外,从 time_t 转换为 long int 有效,所以我所做的只是使用两个 long int 进行简单计算,将结果放入 uint64_t,所以我不确定为什么我得到一个明显错误的值。 有任何想法吗? 这只是一种错误的格式化方式(使用 %llu)吗?

任何一个:

uint64_t t_int = ((uint64_t)t.tv_sec * 1000000 + t.tv_usec) * 1000;

或者:

uint64_t t_int = (t.tv_sec * 1000000ULL + t.tv_usec) * 1000;

后者跳过强制转换,而是通过使*的右侧操作数已经是至少 64 位的类型来执行提升(而不是将左侧强制转换为一个)。 要么工作; 这是你喜欢什么风格的问题。

不要像你做的那样通过long类型的临时变量 go。 long可能是 32 位类型,不适合 2038 年 1 月之后的时间。如果您需要临时变量,请将其time_tint64_t或类似的。 但这不是必需的。

此外,您可能需要考虑使用int64_t (并将ULL更改为LL )而不是uint64_t ,以便您可以表示 1970 年之前的时间。

您正在计算long int宽度。 因为它溢出了未定义的行为,并且为uint64_t分配了一些负值,这导致了一个很大的正值(在您的体系结构上)。 使用uint64_tunsigned long long精度计算。 为了迂腐,请转换所有值:

uint64_t t_int = ((uint64_t)sec * 1000000ull + (uint64_t)t.tv_usec) * 1000ull; 

但是由于促销活动,很可能只需将一个值转换为uint64_t就足够了:

uint64_t t_int = ((uint64_t)sec * 1000000 + t.tv_usec) * 1000;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM