【问题标题】:Strange "unsigned long long int" behaviour [duplicate]奇怪的“unsigned long long int”行为[重复]
【发布时间】:2011-08-25 05:33:44
【问题描述】:

可能重复:
How do you printf an unsigned long long int?

#include <cstdio>

int main ()
{
    unsigned long long int n;
    scanf("%llu",&n);
    printf("n: %llu\n",n);
    n /= 3;
    printf("n/3: %llu\n",n);
    return 0;
}

无论我输入什么,我都会得到非常奇怪的输出,例如:

n: 1
n/3: 2863311531

n: 2
n/3: 2863311531

n: 1000
n/3: 2863311864

这是什么原因?我应该如何正确地做到这一点?

(g++ 3.4.2,Win XP)

【问题讨论】:

  • 你能写一下, sizeof(unsigned long long int) 的值是多少?并尝试使用 'unsigned long int' 而不是 '..long long..'
  • 在 GCC 4.2.1 上也适用于我
  • sizeof(unsigned long long int) 返回 8。我已将变量类型更改为 unsigned long int,它工作正常,但 sizeof(unsigned long int) 返回 4,所以它是常规 int。我需要更广的范围。
  • #include &lt;cstdio&gt; 暗示 C++,但 unsigned long long int%llu 暗示 C。你想使用哪个?
  • 我在 Linux 上检查了相同的代码,它运行良好......

标签: c++ c


【解决方案1】:

问题在于 MinGW 依赖于 msvcrt.dll 运行时。即使 GCC 编译器支持像 long long 这样的 C99-isms,处理格式字符串的运行时也不理解 "%llu" 格式说明符。

您需要使用 Microsoft 的 64 位整数格式说明符。我认为"%I64u" 可以解决问题。

如果你#include &lt;inttypes.h&gt;,你可以使用它提供的宏来更便携:

int main ()
{
    unsigned long long int n;
    scanf("%"SCNu64, &n);
    printf("n: %"PRIu64"\n",n);
    n /= 3;
    printf("n/3: %"PRIu64"\n",n);
    return 0;
}

请注意,MSVC 在 VS 2010 之前没有 inttypes.h,因此如果您想移植到这些编译器,您需要挖掘自己的 inttypes.h 副本或从 VS 2010 中获取一个(其中我认为可以与早期的 MSVC 编译器一起使用,但我不完全确定)。再说一次,要移植到这些编译器,您需要对 unsigned long long 声明做类似的事情,这将需要挖掘 stdint.h 并使用 uint64_t 而不是 unsigned long long

【讨论】:

  • SCNu64PRIu64 宏不适用于 unsigned long long。如果你想使用它们,你需要将n声明为uint64_t
猜你喜欢
  • 2016-06-28
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2016-12-20
  • 1970-01-01
  • 2012-01-27
  • 2012-05-26
相关资源
最近更新 更多