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++);、関数は常に counter の代わりに 0 を出力しました! この奇妙な事実の説明はありますか?

4

3 に答える 3

3

time()time_t多くのプラットフォームで 64 ビットのtype を返しますが、ほとんどが 32ビットの type を"%d"参照します。int

于 2012-05-30T15:58:08.480 に答える
2

%dフォーマット指定子は、型を期待していることを意味しprintfますint。しかし、 ;time()を返します。time_tそれが よりも大きい場合、予想intよりも多くのものがスタックに置かれprintf、基本的に後続のすべての引数の位置がオフセットされます (したがって、時間値の上位バイトは 2 番目の引数として解釈されます)。

(確認するには、 と を比較sizeof(int)してくださいsizeof(time_t)。)

考えられる解決策については、たとえば次の質問への回答を参照してください: time_t とはどのようなプリミティブ データ型ですか? .

于 2012-05-30T15:58:32.510 に答える
1

time()(少なくとも Windows では)の結果は64 ビット整数です。%d印刷以外の形式を使用する必要があります。試してみてください%lld

Intel はリトル エンディアン プロセッサであるため、下位 32 ビットを取得したため、最後に機能しました。

于 2012-05-30T16:01:25.893 に答える