すまない、ちょっとお尋ねします

debian lenny なんつー古い環境で開発せざるを得ない中、C++で「unsigned long long」型を使おうとしてるんだけど
16ビットずつシフトさせていくと、32ビットを超えた部分が消えてしまう

a = 0x00000000ffffffff;
a << 16;
→ 0x00000000ffff0000

こんな感じ、本来なら0x0000ffffffff0000になるはずだが…
環境変えろは分かるんだが、以前のgccでそんなバグの事例があったかどうかが知りたいです