需要清楚了解timespec结构

时间:2014-02-05 08:55:37

标签: c linux time gettime

在我的项目中,我正在使用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格式并帮助我详细了解这个结构?我在我的研究中使用这个代码,关于代码执行时间的纳秒精度的时间计算

1 个答案:

答案 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}}。