c - C - 到 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
像以前那样通过类型的临时变量。long
可能是 32 位类型,不适合 2038 年 1 月之后的时间。如果您需要临时变量,请制作time_t
或int64_t
类似。但这不是必需的。
此外,您可能需要考虑使用int64_t
(并更改ULL
为LL
)而不是uint64_t
,以便您可以表示 1970 年之前的时间。
推荐阅读
- javascript - 单击导航栏按钮并转到实际的 div?
- python - 是否有一种更简洁的方式来导航这个 Python 嵌套数据结构?
- snowflake-cloud-data-platform - 新帐户命令未将电子邮件识别为字符串
- powershell - 在远程计算机上卸载包
- kotlin - 对 kotlin 的 PMD 支持
- java - Java - 仅删除第一个反斜杠
- vb.net - 在电子邮件正文中使用剪贴板的内容
- javascript - 将数据发送到 Express 后端
- javascript - react native : TouchableOpacity 如何根据条件显示或隐藏?
- excel - EXECEL这个公式有什么问题总是得到这个错误