2

谁能解释这个程序的输出以及我该如何解决它?

unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);

// 18446744073490980372
4

3 回答 3

11

你有<stdlib.h>包括吗?

如果我省略,我可以在 MacOS X 上重现<stdlib.h>.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned long long ns = strtoll("123110724001300", (char **)NULL, 10);
    printf("%llu\n", ns);
    return(0);
}

省略标题,我得到你的结果。包括标题,我得到正确答案。

32 位和 64 位都可以编译。


如注释中所述,在没有声明 strtoll() 的情况下,编译器将其视为返回 int 的函数。

要了解更多信息,请查看十六进制输出:

     123110724001300    0x00006FF7_F2F8DE14    Correct
18446744073490980372    0xFFFFFFFF_F2F8DE14    Incorrect

手动插入下划线...

于 2009-10-29T19:45:32.993 回答
3

如果你想要一个 unsigned long long 为什么不使用 strtoull?

于 2009-10-29T19:40:45.520 回答
1

我无法解释这种行为。但是,在带有 Cygwin 的 32 位 Windows XP 上gcc-4.3.2

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    unsigned long long ns = strtoull("123110724001300", NULL, 10);
    fprintf(stderr, "%llu\n", ns);
    return 0;
}

印刷

E:\首页> t.exe
123110724001300
于 2009-10-29T19:42:37.077 回答