では、以前のバージョンのコードの何が問題になっているのでしょうか?
おそらく、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 ビットが必要です。