では、以前のバージョンのコードの何が問題になっているのでしょうか?
おそらく、2011年より前のコンパイラを使用しており、システムlongには32ビットがあります。値 (-2 31 ) が に収まるとは限らないlongため、オーバーフローする可能性があります。これにより未定義の動作が発生するため、何でも見ることができます。
表示される特定の値 (2 31 )の最も可能性の高い説明は、C++ で定義された動作がないため、コンパイラが古い C90 規則を使用し、値を に変換していることunsigned longです。
int型じゃないの?
2011 年より前はint、値が で表現できる場合int、それ以外longの場合は未定義の動作で十分でない場合でした。C++11 は型を追加し、十分な大きさでないlong long場合に整数リテラルに使用できるようにします。long
または、整数の下限は正確には何ですか?
N ビットの符号付き整数型の範囲は、少なくとも -2 (N-1) +1 から 2 (N-1) -1 です。あなたの値は -2 31で、これは 32 ビット符号付きタイプの範囲外です。
言語は整数型の正確なサイズを指定しません。それにintは、少なくとも 16 ビット、long少なくとも 32 ビット、および (2011 年以降)long long少なくとも 64 ビットが必要です。