C++で、int型のサイズが32bitで出力された場合。
int a = 0; int b =10000000;
一見すると桁が違うから大きさが違うように見えるが、0も一桁ではない。仮にintが32bitなら0は
00000000000000000000000000000000
という32bitの値になる(2進数)
10000000は
00000000100110001001011010000000
という32bitの値になる(2進数)
この32桁の2進数は違う値を示すが、桁数(を表現するために必要な領域)は同じ。
[hr]
あまり他人の回答に鉞は投げたくないのだが、
Hiragi(GKUTH) さんが書きました: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.
int型は実行環境における自然なサイズで表現されると書かれている。つまり、規格には32bitや16bitと言ったルールは存在しない。
たまたま、偶然にも32bitや16bitで表現されることが多いだけである。各コンパイラがドキュメントで警告しているように、int型のサイズは実行環境に依存することを踏まえ、サイズに依存するコードを書いてはいけない。上記の記述は初心者の誤解を産みがちで、オーバーフローよりもずっと「危険」なことに繋がりかねない。もしかしたら今後intは64bitが当たり前の時代だって来るかもしれない。
that is, large enough to contain any value in the range of INT_MIN and INT_MAX, as defined in the header <climits>.
int型の最大値はINT_MAX、最小値はINT_MINとして、標準ヘッダclimitに定義される。これはCの標準ライブラリだが、intに関しての規格はC言語と互換があるため、問題ない。
ただし、互換があるだけでC++でこれはおすすめしない。C++標準ライブラリlimitsにstd::numeric_limitsがあるので、これを使うべきである。std::numeric_limits<int>::max()とすれば最大値を取得できる。
The signed and unsigned integer types shall satisfy the constraints given in the C standard, section 5.2.4.2.1.
符号あり、符号なしのint型はC言語規格と互換がある。
標準ヘッダ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の型を使うべきである。組み込みは考えない。
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.
符号なしint型に関しては、2
nを法とするモジュロ算術に従うことが定められている。つまり、符号なし整数型はオーバーフローしない。
std::numeric_limits<unsigned int>::max() + 1
の結果は0になることが定められているということだ。
宣言された時点で確保、というのも微妙なラインだが、あまりほじくっても仕方ないので触れないことにする。
規格の文面はWorking Draft, Standard for Programming Language C++ N4296より引用した。
§ 3.9.1 Fundamental types [basic.fundamental]
これはワーキングドラフトであり正式な規格ではないが、intに関する文面はC言語と互換が残されていることもあり、ほとんど変更されていないため、問題はないだろう。