[hr]
int型は実行環境における自然なサイズで表現されると書かれている。つまり、規格には32bitや16bitと言ったルールは存在しない。Plain ints have the natural size suggested by the architecture of the execution environment; the other signed integer types are provided to meet special needs.
たまたま、偶然にも32bitや16bitで表現されることが多いだけである。各コンパイラがドキュメントで警告しているように、int型のサイズは実行環境に依存することを踏まえ、サイズに依存するコードを書いてはいけない。上記の記述は初心者の誤解を産みがちで、オーバーフローよりもずっと「危険」なことに繋がりかねない。もしかしたら今後intは64bitが当たり前の時代だって来るかもしれない。
int型の最大値はINT_MAX、最小値はINT_MINとして、標準ヘッダclimitに定義される。これはCの標準ライブラリだが、intに関しての規格はC言語と互換があるため、問題ない。that is, large enough to contain any value in the range of INT_MIN and INT_MAX, as defined in the header .
ただし、互換があるだけでC++でこれはおすすめしない。C++標準ライブラリlimitsにstd::numeric_limitsがあるので、これを使うべきである。std::numeric_limits::max()とすれば最大値を取得できる。
符号あり、符号なしのint型はC言語規格と互換がある。The signed and unsigned integer types shall satisfy the constraints given in the C standard, section 5.2.4.2.1.
標準ヘッダcstdintに、C++11以降では型のサイズをある程度指定できる型が定義されている。以下は一例。
実行環境における最大の整数型
intmax_t
最低でも指定bit数を持つ型
int_least32_t
int_least16_t
最低でも指定bit数を持ち、最速で計算できる型
int_fast16_t
int_fast32_t
C++03までの環境でも、boostに同様のものがある。boost.integerのほうが汎用的である。
ちなみに各コンパイラ固有の、専用のサイズ指定の型がある場合があるが、一般的には型のサイズは標準ライブラリかboostの型を使うべきである。組み込みは考えない。
符号なしint型に関しては、2nを法とするモジュロ算術に従うことが定められている。つまり、符号なし整数型はオーバーフローしない。Unsigned integers shall obey the laws of arithmetic modulo 2n where n is the number of bits in the value representation of that particular size of integer.
std::numeric_limits::max() + 1
の結果は0になることが定められているということだ。
規格の文面はWorking Draft, Standard for Programming Language C++ N4296より引用した。
§ 3.9.1 Fundamental types [basic.fundamental]
これはワーキングドラフトであり正式な規格ではないが、intに関する文面はC言語と互換が残されていることもあり、ほとんど変更されていない(おそらく今後もされることはない)ため、問題はないだろう。