unsigned long long で奇妙な問題が発生しています。
unsigned long long を設定すると発生します (size_t を使用しましたが、問題は ull で再現可能です)。2^31 に設定しましたが、何らかの理由で 18446744071562067968、つまり 2^64 - 2^31 に戻ります。x64 コンパイルを使用していることに注意してください。
unsigned long long a = 1 << 31;
cout << a;
//Outputs 18446744071562067968, Expected 2147483648
ull の限界は 2^64-1 だと思いましたか? では、なぜ 2^31 を格納できないのでしょうか? 2^30 で十分です。Sizeof(a) は 8 を返します。これは、私の間違いでなければ 64 ビットであり、2^64-1 の制限を証明しています。
Visual C++ 2013 Express デスクトップでコンパイルしています。
私の唯一の推測は、通常の long 型に適合しないため、何らかのタイプのオーバーフロー エラーであるということです。