在我的项目中,我正在使用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
格式并帮助我详细了解这个结构?我在我的研究中使用这个代码,关于代码执行时间的纳秒精度的时间计算
答案 0 :(得分:1)
无符号32位类型(如现代平台上的unsigned int
)最大值略高于40亿。如果你有5并且乘以10亿(就像在问题中的代码中所做的那样),你将获得50亿的值,大于32位无符号类型中可以包含的值。输入64位类型,可以保持 批次 更高的值(18446744073709551615
更精确,以便与仅无符号的32位最大值进行比较4294967295
)。
顺便说一句,代码可以简化为
start.tv_sec * 1000000000ULL + start.tv_nsec
这种简化是可能的,因为编译器会根据需要自动将低精度类型和值转换为更高精度。由于表达式中有unsigned long long
(这是ULL
表示的)字面值,表达式的其余部分也将转换为unsigned long long
,结果将为{{1}类型1}}。