C-时间值到uint64_t

  • 本文关键字:uint64 时间 c timeval
  • 更新时间 :
  • 英文 :


早上好!

我正试图从一个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"

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

任一:

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位的类型来执行提升(而不是将左侧强制转换为1(。两者都有效;这是你喜欢什么风格的问题。

不要像以前那样遍历long类型的临时变量。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;

相关内容

  • 没有找到相关文章

最新更新