在Windows中计算C中的百分比

时间:2013-04-19 03:45:41

标签: visual-c++ gcc percentage

我有以下代码行来计算计数/总数的百分比。

在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中获得正确的值?

1 个答案:

答案 0 :(得分:2)

%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是little-endian,因此这些字节几乎肯定是00000000。

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