strtoull 和 long long 算术
-
22-07-2019 - |
题
谁能解释一下这个程序的输出以及如何修复它?
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
解决方案
你有 <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
手动插入下划线...
其他提示
如果你想为什么不使用strtoull将一个unsigned long长?
我无法解释的行为。然而,在32位的Windows XP使用Cygwin 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:\Home> t.exe 123110724001300
不隶属于 StackOverflow