数値型の「範囲」を理解する重要性
C#は静的型付け言語であり、int(整数)やdouble(浮動小数点数)などの数値型には、格納できる値の範囲(最小値と最大値)が厳密に定められています。
計算処理を行う際、結果がその型の最大値を超える(オーバーフロー)か、最小値を下回る(アンダーフロー)と、意図しない値(例えば、大きな正の数が突然負の数になるなど)に変わってしまう可能性があります。
このようなバグを防ぐため、C#では各数値型が許容する最小値と最大値を取得するためのプロパティが提供されています。
MinValue と MaxValue プロパティ
C#の組み込み数値型(intやdoubleなど)は、実際には.NETの構造体(例: System.Int32, System.Double)のエイリアスです。
これらの構造体は、その型が取りうる最小値を示す MinValue と、最大値を示す MaxValue という静的な定数(または静的な読み取り専用フィールド)を公開しています。
整数型(int, long)の最大値・最小値
int型(32ビット符号付き整数)やlong型(64ビット符号付き整数)の限界値を取得する例です。
using System;
public class IntegerRangeExample
{
public static void Main()
{
// int型 (System.Int32)
int maxInteger = int.MaxValue;
int minInteger = int.MinValue;
Console.WriteLine($"--- int (32ビット) ---");
Console.WriteLine($"最大値 (int.MaxValue): {maxInteger}");
Console.WriteLine($"最小値 (int.MinValue): {minInteger}");
// long型 (System.Int64)
long maxLong = long.MaxValue;
long minLong = long.MinValue;
Console.WriteLine($"--- long (64ビット) ---");
Console.WriteLine($"最大値 (long.MaxValue): {maxLong}");
Console.WriteLine($"最小値 (long.MinValue): {minLong}");
}
}
出力結果(例):
--- int (32ビット) ---
最大値 (int.MaxValue): 2147483647
最小値 (int.MinValue): -2147483648
--- long (64ビット) ---
最大値 (long.MaxValue): 9223372036854775807
最小値 (long.MinValue): -9223372036854775808
浮動小数点数型(double, decimal)の最大値・最小値
double型(倍精度浮動小数点数)やdecimal型(高精度10進数)も同様に、MinValueとMaxValueを持っています。
double型
double型は非常に大きな(または非常に小さな)値を表現できますが、MinValueは「負の方向に最も大きな値」を意味します。「0に最も近い正の値」ではない点に注意が必要です(0に最も近い正の値は double.Epsilon で取得できます)。
using System;
public class FloatingPointRangeExample
{
public static void Main()
{
// double型 (System.Double)
double maxDouble = double.MaxValue;
double minDouble = double.MinValue;
double epsilonDouble = double.Epsilon;
Console.WriteLine($"--- double ---");
Console.WriteLine($"最大値 (double.MaxValue): {maxDouble}");
Console.WriteLine($"最小値 (double.MinValue): {minDouble}");
Console.WriteLine($"0より大きい最小値 (double.Epsilon): {epsilonDouble}");
}
}
出力結果(例):
--- double ---
最大値 (double.MaxValue): 1.7976931348623157E+308
最小値 (double.MinValue): -1.7976931348623157E+308
0より大きい最小値 (double.Epsilon): 4.9406564584124654E-324
decimal型
金融計算などに用いられるdecimal型は、doubleよりも表現できる値の「範囲」は狭いですが、「精度」が非常に高い(28〜29桁)ことが特徴です。
using System;
public class DecimalRangeExample
{
public static void Main()
{
// decimal型 (System.Decimal)
decimal maxDecimal = decimal.MaxValue;
decimal minDecimal = decimal.MinValue;
Console.WriteLine($"--- decimal ---");
Console.WriteLine($"最大値 (decimal.MaxValue): {maxDecimal}");
Console.WriteLine($"最小値 (decimal.MinValue): {minDecimal}");
}
}
出力結果(例):
--- decimal ---
最大値 (decimal.MaxValue): 79228162514264337593543950335
最小値 (decimal.MinValue): -79228162514264337593543950335
符号なし整数の場合 (byte, uint)
byte(8ビット符号なし整数)やuint(32ビット符号なし整数)など、符号なし(Unsigned)の型は、負の数を扱わないため、**MinValueは常に0**になります。
using System;
public class UnsignedRangeExample
{
public static void Main()
{
// byte型 (System.Byte)
Console.WriteLine($"--- byte (符号なし8ビット) ---");
Console.WriteLine($"最大値 (byte.MaxValue): {byte.MaxValue}"); // 255
Console.WriteLine($"最小値 (byte.MinValue): {byte.MinValue}"); // 0
// uint型 (System.UInt32)
Console.WriteLine($"--- uint (符号なし32ビット) ---");
Console.WriteLine($"最大値 (uint.MaxValue): {uint.MaxValue}"); // 4294967295
Console.WriteLine($"最小値 (uint.MinValue): {uint.MinValue}"); // 0
}
}
まとめ
C#の各数値型が提供する [型名].MaxValue と [型名].MinValue を参照することで、その型が安全に処理できる値の範囲をプログラムで確認できます。
これらの値をバリデーション(入力値の検証)やオーバーフローの事前チェックに利用することで、より堅牢で予測可能な数値計算処理を実装することが可能になります。
