C++の整数型は、小数を含まない数値を扱うための型です。
個数、回数、番号、年齢、点数、在庫数のように、整数で表せる値を扱うときに使います。
たとえば、0、1、10、100、-5 のような値は整数型で扱えます。
一方で、3.14 や 0.5 のような小数は整数型ではなく、浮動小数点型で扱います。
整数型はC++の基本のひとつで、変数、配列、ループ、条件分岐、ファイル処理など、さまざまな場面で使われます。
そのため、整数型の種類や特徴を理解しておくことはとても重要です。
C++で使われる主な整数型
C++で代表的な整数型には、次のようなものがあります。
shortintlonglong long
これらはどれも整数を扱う型ですが、表現できる値の範囲やサイズの傾向が異なります。
short
short は int 以下のサイズを持つ整数型です。
多くの環境では int より小さいサイズですが、同じサイズになる場合もあります。
扱う値が比較的小さいことが分かっている場合に使われることがありますが、通常のアプリケーション開発では int が使われることのほうが多いです。
int
int は、最も基本的な整数型です。
整数を扱うとき、特別な理由がなければまず int を使うことが多くなります。
回数、個数、点数、人数、添字など、一般的な整数処理に広く使われます。
C++を学び始めたばかりなら、まず int を中心に理解すると分かりやすいです。
long
long は int 以上の範囲を持つ整数型です。
ただし、環境によっては int と同じサイズ、同じ範囲になることがあります。
そのため、long を使えば必ず int より大きな値を扱える、と考えるのは正確ではありません。
環境差を意識する必要がある型です。
long long
long long は、より大きな整数を扱うための型です。
多くの環境で int より広い範囲を扱えるため、大きな数値計算や件数の集計、サイズの大きい値などでよく使われます。
競技プログラミングや、大きな値を扱う実務処理でもよく登場する型です。
整数型には符号付きと符号なしがある
C++の整数型には、負の値を扱えるものと、0以上の値だけを扱うものがあります。
符号付き整数型
通常の整数型は、符号付きです。
これは、正の数だけでなく負の数も扱えるという意味です。
たとえば int は、通常は符号付き整数型として使われます。
そのため、-1 や -100 といった値も保存できます。
符号なし整数型
unsigned を付けると、符号なし整数型になります。
こちらは負の値を扱わない代わりに、0以上の値をより大きな最大値まで表現できます。
たとえば unsigned int は、負の値を持たない個数やサイズなどに使われることがあります。
ただし、計算や比較で注意が必要なため、単純に「負の値を使わないから unsigned にする」と考えるのは危険です。
signed と unsigned の違い
C++では、整数型に signed または unsigned を付けられます。
signedは負の値を含めて扱えるunsignedは0以上の値だけを扱う
signed は省略されることが多く、int は通常 signed int と同じ意味で使われます。
一方で unsigned int は、同じサイズの signed int より大きな最大値を表現できます。
ただしその代わり、負の値は扱えません。
また、signed と unsigned が混ざった計算では、意図しない型変換が起こることがあります。
このため、符号なし整数型は便利そうに見えても、扱いには注意が必要です。
各整数型のサイズについて
C++では、整数型のサイズは完全に固定されているわけではありません。
ここは初心者が特に誤解しやすいポイントです。
たとえば、int が常に4バイト、long が常に8バイト、というように決まっているわけではありません。
C++の規格では、各型に一定の順序関係や最低限の条件はありますが、実際のサイズは環境に依存します。
多くの環境では、次のようになることが多いです。
shortは 2バイトintは 4バイトlongは 4バイト または 8バイトlong longは 8バイト
ただし、これはあくまで一般的な例です。
環境によって異なる可能性があるため、サイズが重要な場面では注意しなければなりません。
整数型に値の範囲がある理由
整数型は、コンピュータ内部で決められたビット数を使って表現されます。
そのため、無限に大きな整数を保存できるわけではなく、型ごとに表現できる最小値と最大値があります。
ビット数が少なければ表現できる範囲は狭くなり、ビット数が多ければより大きな値を扱えます。
この仕組みがあるため、どの整数型にも上限と下限があります。
オーバーフローに注意する
整数型を使ううえで特に重要なのが、オーバーフローです。
これは、型が表現できる範囲を超える値を扱ったときに起こる問題です。
たとえば、大きすぎる値を保存したり、計算結果が型の上限を超えたりすると、正しい結果は保証されません。
ここで注意したいのは、符号付き整数型と符号なし整数型で扱いが異なることです。
符号付き整数型の場合
符号付き整数型が表現範囲を超える計算は、C++では未定義動作です。
これは、結果がどうなるか言語仕様として保証されないという意味です。
実行環境によっては不自然な値になることがあり、場合によっては見た目上マイナスになったり、想定外の結果になったりします。
ただし、それが常に同じ動作になるとは限りません。
符号なし整数型の場合
符号なし整数型では、値は一定の規則で循環します。
そのため、最大値を超えると 0 に戻るような挙動になります。
ただし、これも分かりにくいバグの原因になるため、範囲を超える計算は避けるべきです。
unsigned を使うときの注意点
unsigned は、負の値を使わない場面に向いているように見えます。
しかし、実際には注意点が多い型です。
たとえば、0から1を引くと、数学的には -1 です。
ですが、符号なし整数型では負の値を表せないため、非常に大きな値として扱われます。
また、符号付き整数と符号なし整数を比較すると、思わぬ変換が起きることがあります。
その結果、見た目には正しそうな比較式でも、意図と違う判定になることがあります。
このため、unsigned は必ずしも安全な型ではありません。
必要性がはっきりしている場合に使うのが基本です。
整数リテラルとの関係
C++では、ソースコードに直接書く整数値を整数リテラルと呼びます。
たとえば 10、100、1000 などが整数リテラルです。
整数リテラルは、その値の大きさや書き方によって、どの整数型として扱われるかが変わります。
また、末尾に特定の接尾辞を付けることで、型を明示することもできます。
たとえば、符号なし整数として扱いたい場合や、より大きな整数型として扱いたい場合には、それに対応した書き方があります。
大きな数値を扱う場面では、この点を理解しておくと型の不一致を避けやすくなります。
char も整数型の一種
char は文字を表す型として知られていますが、分類上は整数型の一種です。
文字は内部的には数値として表現されているため、char も数値として扱えます。
ただし、通常は文字を扱う目的で使われるため、整数計算のために使うことはあまりありません。
また、char が符号付きとして扱われるか、符号なしとして扱われるかは環境によって異なります。
さらに、char、signed char、unsigned char は別の型です。
この点は、文字コードやバイナリデータを扱う場面で意識しておく必要があります。
bool と整数の関係
bool は、true と false を表すための型です。
条件分岐や判定処理で使われます。
bool は整数と関係があり、false は 0、true は 1 として整数に変換されます。
そのため、整数との変換が行われる場面もあります。
ただし、bool は整数計算のための型ではありません。
役割はあくまで真偽値の表現なので、通常の整数型と同じ感覚で扱うべきではありません。
固定幅整数型も重要
C++では、int や long のサイズが環境によって変わることがあります。
そのため、サイズが明確な整数型を使いたい場面では、固定幅整数型が重要になります。
代表的なものには、次のような型があります。
int8_tint16_tint32_tint64_tuint8_tuint16_tuint32_tuint64_t
これらは、対応するビット幅の整数型が利用できる環境で定義されます。
一般的な現在の環境では広く利用できます。
このような型は、特に次のような場面で重要です。
- ファイル形式の仕様が決まっているとき
- 通信データの形式が厳密に決まっているとき
- バイナリデータを扱うとき
- ハードウェアに近い処理を行うとき
- 環境差を避けたいとき
通常のアプリケーションでは int や long long で十分なことも多いですが、ビット幅が重要な処理では固定幅整数型が適しています。
どの整数型を選べばよいか
整数型を選ぶときは、用途に応じて考えることが大切です。
一般的な整数処理なら int
特別な条件がなければ、まず int が基本です。
通常の回数や個数、番号などを扱うなら、int で十分なことが多くなります。
大きな値を扱うなら long long
合計値、件数、サイズ、金額など、値が大きくなる可能性があるなら long long を検討すると安心です。
int では範囲が足りない場面でも対応しやすくなります。
ビット幅が重要なら固定幅整数型
通信、ファイル形式、バイナリ処理、ハードウェア制御などでは、int32_t や uint64_t のような固定幅整数型が向いています。
unsigned は慎重に使う
値が負にならないことが分かっていても、unsigned には計算や比較で注意点があります。
明確な理由がない限り、安易に選ばないほうが安全です。
整数型を理解するうえで大切なポイント
C++の整数型を学ぶときは、次の点を押さえておくと理解しやすくなります。
型ごとに表現できる範囲が違う
同じ整数でも、どの型を使うかによって扱える値の範囲が変わります。
サイズは環境依存のことがある
int や long は、環境によってサイズが異なる可能性があります。
符号の有無で挙動が変わる
signed と unsigned では、表現できる値の範囲だけでなく、計算時の挙動も変わります。
オーバーフローは危険
表現範囲を超える計算は、不具合や予期しない結果の原因になります。
用途に合った型を選ぶことが重要
整数型はどれでも同じではなく、用途に応じて適切に使い分けることが大切です。
まとめ
C++の整数型は、小数を含まない数値を扱うための基本的な型です。
主な種類には short、int、long、long long があり、さらに符号付きと符号なしの違いもあります。
理解しておきたい重要な点は、次の通りです。
- 整数型には複数の種類がある
- 型ごとに表現できる値の範囲が異なる
intは一般的な整数処理の基本になるlongはintと同じサイズになる環境もある- 大きな値には
long longが向いている unsignedは便利に見えて注意点も多い- オーバーフローは安全ではない
- 環境差を避けたいなら固定幅整数型が役立つ
整数型はC++のあらゆる基本処理に関わるため、ここをしっかり理解しておくと、その後の学習も進めやすくなります。
以上、C++の整数型についてでした。
最後までお読みいただき、ありがとうございました。
