2011-06-05 66 views
0

大的数字,为什么要这样的代码应该提供这么高的结果,当我给它数4293974227(或更高版本)问题在C

int main (int argc, char *argv[]) 
{ 


unsigned long long int i; 

unsigned long long int z = atoi(argv[1]); 

unsigned long long int tmp1 = z; 


unsigned long long int *numbers = malloc (sizeof (unsigned long long int) * 1000); 

for (i=0; tmp1<=tmp1+1000; i++, tmp1++) { 

    numbers[i] = tmp1; 
    printf("\n%llu - %llu", numbers[i], tmp1); 
} 

} 

结果应与所提供的数字开始,但开始喜欢这个:

18446744073708558547 - 18446744073708558547 
18446744073708558548 - 18446744073708558548 
18446744073708558549 - 18446744073708558549 
18446744073708558550 - 18446744073708558550 
18446744073708558551 - 18446744073708558551 

ECC ...

这是什么废话?

谢谢!

+0

'atoi'(和朋友)无法检测到错误。 'atoi(“foobar”)'调用未定义的行为(可能返回'0')并且不会显示错误。坚持'strtol'(和朋友) – pmg 2011-06-05 18:59:23

+1

当你不明白发生了什么事情时,不要这么快就把某些东西标记为“垃圾”。 – 2011-06-05 19:15:18

回答

6

atoi()返回int。如果您需要更大的号码,请尝试strtol(), strtoll()或其亲属。

+0

strtoll不只是需要argv [1],但我不明白的其他参数。什么是“基地”?我很困惑。 – Joseph 2011-06-05 20:46:23

+0

@约瑟夫,你看过手册页吗? “基数”是数学意义上的。您可能想要为您的特定问题传递“10”或“0”。 – 2011-06-06 15:13:32

3

atoi()返回(int),并且不能处理(long long)。尝试atoll(),或者失败atol()(前者是首选)。

+0

'atoll()'不是标准的; 'strtoll()'是。 – Nemo 2011-06-05 18:57:47

+0

@Nemo:“atoll()'函数符合ISO/IEC 9899:1999(”ISO C99“)。”根据我看到的参考。也就是说,无论如何,strtoll()可能会更好。 – geekosaur 2011-06-05 18:59:00

+0

我的错误;两者都是标准的。道歉(和+1) – Nemo 2011-06-05 19:00:29

0

您正在将有符号整数打印为无符号。

+0

你从哪里看到的? – 2011-06-05 19:00:41