我有以下代码行来计算计数/总数的百分比。
在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中获得正确的值?
答案 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位值。