为什么在使用基于clock()的定时器MACRO时会得到负值?

时间:2012-10-06 06:58:48

标签: c++ c timer macros clock

宏是这样的:

#define MAX 10000000
#define CNT 1000000
#define TIMER_INIT             \
    clock_t starttime, endtime;    \
#define TIMER(txt, process)                     \
    starttime = clock();                        \
    process;                            \
    endtime = clock();                      \
    printf("%-20s %20ld\n",                     \
           txt, (endtime - starttime))

主要代码是这样的:

char vector2[CNT/8 + 1];

TIMER(  "bitsort",
        for(i = 0; i < CNT; ++i)
            set1(rand() % MAX, vector2));

set1函数是这样的:

void set1(int pos, char* vector)        /* set the position to 1 */
{
    vector[pos/8] |= (0x1 << pos%8);
}

当我执行程序时,输出看起来像这样..

bitsort                -36035411302143896

即使我像这样将差异转换为unsigned int,它仍然不起作用:

#define TIMER(txt, process)                     \
    starttime = clock();                        \
    process;                            \
    endtime = clock();                      \
    printf("%-20s %20d\n",                      \
           txt, (unsigned int)(endtime - starttime))

输出为bitsort -16766097

我尝试将%ld修改为%d,但它不起作用。

但如果我在参数中不使用for,请执行以下操作:

TIMER("bitsort", set1(rand() % MAX,vector2));

TIMER完美无缺,给我一个合理的结果..

有没有人知道我的代码有什么问题?是由宏还是由clock()函数引起的?谢谢!

1 个答案:

答案 0 :(得分:2)

我找到了你的问题:

请查看此文档http://www.cplusplus.com/reference/clibrary/cstdio/printf/

注意有关%d和%i的事情? 签名十进制整数

你必须使用%u或%lu,因为clock_t是无符号的,而unsigned int显然也是无符号的。

编辑:这只是问题的一半,另一半是他在函数中摧毁他的堆栈(MAX大于CNT),感谢@nneonneo在聊天中发现那个。