【问题标题】:Calculating percentage in C in Windows在 Windows 中用 C 语言计算百分比
【发布时间】:2013-04-19 03:45:40
【问题描述】:

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

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

【问题讨论】:

    标签: visual-c++ gcc percentage


    【解决方案1】:

    %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 位整数变量“count”传递给printf。剩下的 4 个字节仍在堆栈上。然后,当printf 去删除“double”的 8 个字节(64 位)作为百分比时,它首先以“count”剩余的 4 个字节结束。由于 Intel x86 CPU 是 little-endian,因此这些字节几乎可以肯定是 00000000。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2021-01-10
      • 2017-05-13
      相关资源
      最近更新 更多