プリミティブ型とは?
プリミティブ型とは、プログラミング言語において最も基本的なデータ型を指します。
これらの型は独立して存在し、通常はコンパイラによって事前に定義されています。
プリミティブ型はプログラム内で値を直接保持し、効率的に処理されるため、プログラミングの基盤となる重要な要素です。
簡単に言えば、bool、byte、int、float など、最初から使える変数の型を指します。
プリミティブ型の種類
プリミティブ型にはいくつかの種類があります。
整数型
int(32 ビット整数)short(16 ビット整数)long(64 ビット整数)byte(8 ビット整数)
浮動小数型
float(単精度浮動小数点数)double(倍精度浮動小数点数)
文字型
char(単一の文字を表現する)
ブール型
bool(trueまたはfalseの値を持つ)
これらの型はプログラミング言語によって多少異なる場合がありますが、基本的な概念は共通しています。
プリミティブ型が表現できる範囲
bool型
bool 型は、true または false のいずれかの値しか持つことができません。
整数型
整数型にはいくつか種類がありますが、各整数型が表現できる範囲は、型ごとのビット数によって決まります。
byte 型は符号なしの 8 ビットなので、表現できる範囲は 0 から 2^8 - 1 の間、すなわち 0 から 255 です。
一方、int 型は符号ありの 32 ビットで、範囲は -2^31 から 2^31 - 1 の間、つまり -2,147,483,648 から 2,147,483,647 となります。
このように、各プリミティブ型のビット数と符号の有無によって表現できる範囲が異なります。
表現できる範囲を超えたらどうなるか?
byte 型の変数を毎フレーム 1 ずつ加算していくと、256 フレーム目には上限である 255 を超えます。
このように、上限を超えた場合を オーバーフロー と呼び、値が丸められてしまいます。
byte 型を使った場合の例は以下の通りです。
byte n = 255;
n++;
// nは0になる
checked コンテキストを使用すると、オーバーフローが発生した際に例外をスローできます。
byte n = 255;
try
{
var m = checked(n++);
}
catch (OverflowException e)
{
Console.WriteLine("オーバーフローが発生しました: " + e.Message);
}
checked を明示的に指定しない場合、例外が発生せずに値が丸められるため、それに気づかない可能性があります。
例えば、int 型に代入した値が大きすぎて丸められると、期待していた挙動にならず、バグにつながることがあります。
そのため、使用する値に適した型を選択することを心がけましょう。
最大値と最小値
とはいえ、型の表現範囲をすべて覚えるのは大変です。
各プリミティブ型には、最大値と最小値を表す定数が用意されています。
例えば、int.MaxValue と int.MinValue を使えば、それぞれの型の最大値と最小値を簡単に確認できます。
Debug.Log($"int.MaxValue: {int.MaxValue}");
Debug.Log($"int.MinValue: {int.MinValue}");
// int.MaxValue: 2147483647
// int.MinValue: -2147483648
まとめ
今回はプリミティブ型とその表現できる範囲について説明しました。
C#のプログラムを安全に設計するためには、プリミティブ型の特性やその範囲について正しく理解し、
適切なエラーハンドリングを行うことが重要です。
特にオーバーフローが致命的な影響を与える場合は、checkedコンテキストの活用や、
事前にMaxValueやMinValue定数を使用して範囲チェックを行いましょう。
データ型の選択やオーバーフローへの対策をしっかり考えることで、予期しない動作を防ぎ、信頼性の高いプログラムを構築できます。