我有以下代码行来计算计数/总计的百分比。
在 Microsoft Visual C++ 2005 中
printf("Count = %lu (%.2lf%%)\n", count, (double)count/(double)total*100.0);
在海湾合作委员会
printf("Count = %lu (%.2lf\%)\n", count, (double)count/(double)total*100.0);
“count”和“total”都是无符号的 64 位整数。由于某种原因,我能够在 gcc 中获得正确的值,但在 Visual C++ 中始终获得 0.00%。
为什么我在 Windows 中无法获取正确的值?
最佳答案
%lu
打印一个无符号的long int
。在 Visual C++ 中,这是一个 32 位整数,而不是 64 位整数。你说“count”是一个64位整数,所以它不是一个“long int”。 (您必须将其声明为 __int64 count;
或 long long int count;
,对吧?否则您将如何在 Visual C++ 2005 中声明 64 位整型变量?)
由于 printf
不知道您传递了哪些参数或它们有多大,因此它依赖格式字符串来告诉它要为每个参数从堆栈中提取多少字节的数据。通过编写 %lu
,您已经告诉它为“count”删除 4 个字节(32 位)的数据,但是当您传递 64 位时,您传递了 8 个字节(64 位)的数据整数变量“count”到printf
。这使得堆栈上还剩下 4 个字节。然后,当 printf
去删除“double”的 8 个字节(64 位)作为百分比时,它首先会从“count”中剩下 4 个字节。由于 Intel x86 CPU 是小端字节序,因此这些字节几乎肯定是 00000000。
简短回答:编写 %I64u
或 %llu
在 Visual C++ 中打印无符号 64 位值。
关于visual-c++ - 在 Windows 中用 C 计算百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16096879/