Различное поведение оператора сдвига с -O2 и без

Без -O2 этот код печатает 84 84, с флагом O2 на выходе получается 84 42. Код был скомпилирован с использованием gcc 4.4.3. на 64-битной платформе Linux. Почему выходные данные для следующего кода отличаются?

Обратите внимание, что при компиляции с параметром -Os получается 0 42

#include <iostream>
using namespace std;

int main() {
    long long n = 42;
    int *p = (int *)&n;
    *p <<= 1;
    cout << *p << " " << n << endl;
    return 0;
}
8
задан Leonid 4 March 2011 в 16:10
поделиться