2011-06-05 104 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