奇怪的“unsigned long long int”行为

发布于 2024-11-06 23:18:12 字数 667 浏览 0 评论 0原文

可能的重复:
如何 printf 一个 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

or

n: 2
n/3: 2863311531

or

n: 1000
n/3: 2863311864

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

(g++ 3.4.2,Win XP)

Possible Duplicate:
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;
}

Whatever I put in input, I get very strange output, for example:

n: 1
n/3: 2863311531

or

n: 2
n/3: 2863311531

or

n: 1000
n/3: 2863311864

What's the reason? How should I do this correctly?

(g++ 3.4.2, Win XP)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

花桑 2024-11-13 23:18:12

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

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

如果您#include,您可以使用它提供的宏来提高可移植性:

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 之前没有 inttypes.h 2010,所以如果你想移植到这些编译器,你需要挖掘你自己的 inttypes.h 副本,或者从 VS 2010 中获取一个(我认为它可以与早期版本一起使用) MSVC 编译器,但我不完全确定)。话又说回来,为了移植到这些编译器,您需要对 unsigned long long 声明执行类似的操作,这需要挖掘 stdint.h 并使用 < code>uint64_t 而不是 unsigned long long

The problem is that MinGW relies on the msvcrt.dll runtime. Even though the GCC compiler supports C99-isms like long long the runtime which is processing the format string doesn't understand the "%llu" format specifier.

You'll need to use Microsoft's format specifier for 64-bit ints. I think that "%I64u" will do the trick.

If you #include <inttypes.h> you can use the macros it provides to be a little more portable:

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;
}

Note that MSVC doesn't have inttypes.h until VS 2010, so if you want to be portable to those compilers you'll need to dig up your own copy of inttypes.h or take the one from VS 2010 (which I think will work with earlier MSVC compilers, but I'm not entirely sure). Then again, to be portable to those compilers, you'd need to do something similar for the unsigned long long declaration, which would entail digging up stdint.h and using uint64_t instead of unsigned long long.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文