strtoull和长期算术

use*_*033 2 c string long-integer

任何人都可以解释这个程序的输出以及我如何解决它?

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

// 18446744073490980372
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 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);
}
Run Code Online (Sandbox Code Playgroud)

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

32位和64位编译.


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

要查看更多内容,请查看十六进制输出:

     123110724001300    0x00006FF7_F2F8DE14    Correct
18446744073490980372    0xFFFFFFFF_F2F8DE14    Incorrect
Run Code Online (Sandbox Code Playgroud)

手动插入下划线......

  • 如果发生这种情况并且您没有注意到它,那么您的警告级别就不够高了. (4认同)
  • @Tim:实际上,你甚至不需要增加警告级别:它足以从20岁的语言版本切换到10岁的语言版本(即`-std = c99`或`-std = gnu99`); 但是,投入一些额外的标志,如`-pedantic -Wall -Wextra`应该不会受到伤害 (4认同)