Ciao,
Il problema è di banale soluzione... stai incrementando, si, la variabile i nella while... ma non hai provveduto ad inizializzarla a 0.
E'bene fare attenzione a questo genere di cose. Nonostante in certi casi una variabile è inizializzata a zero per default, lo standard non assicura niente in merito, ed i compilatori non si comportano tutti alla stessa maniera.
Un altra causa del problema che hai osservato è il fatto che stai usando un intero con segno... è piuttosto improbabile, ma se incrementi oltre il massimo numero positivo possibile (circa 2 miliardi e rotti) ottieni un numero negativo. Non credo tu stia trattando miliardi di numeri, ma in caso potresti ricorrere ad un unsigned int (0...4miliardi) o, se non bastano, un longlong, un __int64 od un numero reale (float, double).
Ciaociao