1
#ifndef UNICODE 
#define UNICODE
#endif

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <Windows.h>

int main()
{
    char buffer[30];
    int counter=0;

    for(int i=0; i<22 ; i++)
    {       
        Sleep(1000);
        printf("%d %d\n",counter++,time(0));
    }

    system("pause");
    return 0;
}

这个版本工作正常,它输出计数器和最后 22 秒的时间戳。不幸的是,当我做了看似无关的事情 - 替换 counter 和 time(0) 时printf("%d %d\n",time(0),counter++);,函数总是打印 0 代替 counter!对这个奇怪的事实有什么解释吗?

4

3 回答 3

3

time()返回 type time_t,在许多平台上是 64 位的,而"%d"指的int是大多数是 32 位的。

于 2012-05-30T15:58:08.480 回答
2

格式说明%d符意味着需要printf一个int类型。但time()返回一个time_t; 如果它大于 a int,那么将比预期更多的东西放在堆栈上printf,基本上抵消了所有后续参数的位置(因此在你的情况下,时间值的高字节被解释为第二个参数)。

(要确认,您应该比较sizeof(int)sizeof(time_t)。)

有关潜在的解决方案,请参阅以下问题的答案:time_t 是什么原始数据类型?.

于 2012-05-30T15:58:32.510 回答
1

time()(至少在 Windows 上)的结果是一个 64 位整数。您必须使用除%d打印之外的格式。试试%lld

它在最后一次工作时工作,因为你得到了较低的 32 位,因为英特尔是一个小端处理器。

于 2012-05-30T16:01:25.893 回答