"dcb314 at hotmail dot com" <[EMAIL PROTECTED]> writes: | I compiled the following C++ code on a x86_64 machine | without optimisation. | | #include <iostream.h> | | int | main() | { | long long n = 1; | | cout << sizeof( n) << endl; | for (int i = 0; i < 100; ++i) | { | cout << n << ' ' << (float) n << '\n'; | n *= 2; | if (n == 0) | { | break; | } | } | return 0; | } | | When the compiled code runs, it is fine. | There are 64 executions of the loop. | | However, I added flag -O2, and the code runs differently. | There are 100 executions of the loop. | | Suspect optimiser bug.
Rather, user bug. Your program contains an undefined behaviour which is provoked by the overflow of n *= 2; the compiler is therefore technically allowed to do whatever it likes. In this case, the optimizer assumes that you can never get from 1 to 0 by successive exponentiation. Therefore the test n == 0 is never executed. -- Gaby