gettimeofday 获取毫秒时间溢出问题

之前为了测试C中代码执行消耗的时间,所以写了这么一个函数:

long long __getmstime()
{
    timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

之前只是做减法算相差时间,今天突然做了一次输出__getmstime的时间,发现居然是负数,
32位的机器使用long long类型不可能会结果溢出,于是我使用了double类型,依然如此,觉得很奇怪。

但是这种表现一定是溢出啊。

这时想到了C的类型自动转换,tv.tv_sec * 1000这里的计算应该没有进行类型转换,之后会得到一个

溢出的负数,之后返回的时候虽然强转成了Long long,但是已经悲剧了,诶。

最后改改:

long long __getmstime()
{
        timeval tv;
        gettimeofday(&tv, NULL);
        return ((long long)tv.tv_sec) * 1000 + tv.tv_usec / 1000;
}

先把tv.tv_sec转成long long类型,这样就不会造成溢出了。

同事打印的时候:

以lu的方式进行打印,会丢失精度,数值有误

printf("ms:%lu \n",__getmstime());

正确的输出方式为%llu:

printf("ms:%lu \n",__getmstime());

 

这个真是蠢爆了。。不自己操作怎么也不会真正认识到错误!
 

你可能感兴趣的:(编程)