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

%lu打印一个未签名的long int. 在 Visual C++ 中,这是一个 32 位整数,而不是 64 位整数。您说“count”是一个 64 位整数,所以它不是“long int”。(您一定已经将它声明为__int64 count;or long long int count;,对吗?否则您将如何在 Visual C++ 2005 中声明一个 64 位整数变量?)

由于printf不知道您传递了哪些参数或它们有多大,它依赖于格式字符串来告诉它为每个参数从堆栈中拉出多少字节的数据。通过写作%lu,您告诉它为“count”删除 4 个字节(32 位)的数据,但是当您将 64 位整数变量“count”传递给printf. 剩下的 4 个字节仍在堆栈上。然后当printf去删除百分比的“double”的 8 个字节(64 位)时,它首先以“count”剩余的 4 个字节结束。由于 Intel x86 CPU 是 little-endian,因此这些字节几乎可以肯定是 00000000。

简短的回答:在 Visual C++ 中写入%I64u%llu打印一个无符号的 64 位值。

于 2013-04-19T03:59:54.817 回答