C#は、多くの静的型付け言語と同じように、整数を表すさまざまな型を提供していて、それぞれに値の範囲があります。下限側では、sbyte型の最小値は-128、最大値は127です。すべての整数型と同様に、これらの値は<type>.MinValueと<type>.MaxValueとして参照できます。上限側では、long型の最小値は-9,223,372,036,854,775,808、最大値は9,223,372,036,854,775,807です。その間にはshort型とint型があります。
上記の各型には、符号なしの対応する型があります。sbyte/byte、short/ushort、int/uint、long/ulongです。いずれの場合も、値の範囲は0から、符号付きの負の最大値に2を掛けて1を足した値までです。
符号なし整数型の値は、単純な2進数表現で表されます。符号付き型の値は、2の補数による符号付き数値表現を使います。
整数型がこれほど多くあるのは、レジスターのサイズ、CPU命令の引数のサイズ、CPU内での符号の扱いといった、マシンのアーキテクチャーを反映したものです。long型の値は64ビットを使い、sbyte型の値は8ビットを使います。場合によっては、CPUの性能、メモリーの使用量、さらにはディスクの使用量にも影響します(より小さい整数型を選ぶほうが一般に有利です)。整数typeの選択は、想定される値の範囲について他のエンジニアに手っ取り早く伝える方法にもなります。int型は、その用途について特に変わった点が見当たらない場合の既定の型として広く使われます。longやulongは、単純な識別子として広く使われます。型のサイズ(バイト単位)が値の範囲を決めます。
ここまでに扱った型は_プリミティブ_型です。それぞれには、その型に関連するフィールド(MinValueなど)やメソッド(ToString()など)を実装したstructのエイリアスが対応しています。
| 型 | 構造体 | 幅 | 最小値 | 最大値 |
|---|---|---|---|---|
sbyte |
SByte |
8 bit | -128 | +127 |
short |
Int16 |
16 bit | -32_768 | +32_767 |
int |
Int32 |
32 bit | -2_147_483_648 | +2_147_483_647 |
long |
Int64 |
64 bit | -9_223_372_036_854_775_808 | +9_223_372_036_854_775_807 |
byte |
Byte |
8 bit | 0 | +255 |
ushort |
UInt16 |
16 bit | 0 | +65_535 |
uint |
UInt32 |
32 bit | 0 | +4_294_967_295 |
ulong |
UInt64 |
64 bit | 0 | +18_446_744_073_709_551_615 |
ある型の変数(または式)は、簡単に別の型へ変換できます。たとえば代入操作では、代入する値の型(右辺)が、代入先の型(左辺)の範囲に値が収まることを保証していれば、単純な代入ができます。
ulong ul;
uint ui = uint.MaxValue;
ul = ui; // no problem
一方、代入元の型の範囲が、代入先の値の範囲の部分集合でない場合は、たとえその値自体が代入先の範囲に収まっていても、キャスト、つまり()の操作が必要です。
uint ui;
short s = 42;
ui = (uint)s;
上の例で、値が代入先の範囲外だった場合は、オーバーフローが発生します。overflowを参照してください。
キャストが必要かどうかは、個々の値ではなく、関係する2つの型によって決まります。
以降の段落では、整数型のキャストについて説明します。(castingを参照)では、キャストと型変換についてより広く説明しています。整数型と浮動小数点数、char、boolの間の変換については、そちらのドキュメントを参照してください。
C#の型システムは_C_やJavaScriptのものよりいくぶん厳格で、その結果、キャスト操作にもより多くの制限があります。暗黙的なキャストは、「変換先」の型が「変換元」の値の大きさと符号を保てる限り、2つの数値型の間で行われます。
暗黙的なキャストは、特別な構文では示されません。
数値型を暗黙的にキャストできない場合は、通常、明示的なキャスト演算子を使えます。
キャストする値が、変換先の型の幅が足りない、または符号が衝突するといった理由で「変換先」の型に表現できない場合は、オーバーフロー例外がスローされることがあります。
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;
// implicit cast
int from_ushort = shortUnsignedInt; // 65535
float from_int = largeInt; // -21474836E+09
// explicit cast
uint from_largeInt = (uint)largeInt; // 2147483647
uint from_neg = (uint) largeNegInt; // 2147483648 or OverflowException is thrown (if checked)
BitConverterクラスは、整数型とバイト配列を相互に変換する便利な方法を提供します。