2

カウント/合計の割合を計算する次のコード行があります。

Microsoft Visual C++ 2005 の場合

printf("Count = %lu (%.2lf%%)\n", count, (double)count/(double)total*100.0);

gcc で

printf("Count = %lu (%.2lf\%)\n", count, (double)count/(double)total*100.0);

「count」と「total」はどちらも符号なし 64 ビット整数です。何らかの理由で、gcc では正しい値を取得できますが、Visual C++ では常に 0.00% を取得します。

Windows で正しい値を取得できないのはなぜですか?

4

1 に答える 1

2

%luunsigned を出力しlong intます。Visual C++ では、これは 64 ビット整数ではなく 32 ビット整数です。「count」は64ビット整数なので、「long int」ではないとおっしゃいました。(__int64 count;またはとして宣言したに違いありませんよねlong long int count;? Visual C++ 2005 で 64 ビット整数変数を宣言する方法はありますか?)

渡された引数やその大きさがわからないためprintf、フォーマット文字列に依存して、各引数のスタックから取得するデータのバイト数を伝えます。を書くこと%luで、「count」の 4 バイト (32 ビット) のデータを削除するように指示しましたが、64 ビット整数変数「count」を に渡すときに 8 バイト (64 ビット) のデータを渡しましたprintf。これにより、4 バイトがスタックに残ります。次にprintf、パーセンテージの "double" の 8 バイト (64 ビット) を削除すると、最初に "count" から 4 バイトが残ります。Intel x86 CPU はリトルエンディアンであるため、これらのバイトはほぼ確実に 00000000 です。

簡単な答え: Visual C++ で符号なし 64 ビット値を書き込み%I64uまたは出力します。%llu

于 2013-04-19T03:59:54.817 に答える