C#の組み込み型の値の範囲の確認

C#で最初から使用できる型を組み込み型と言います。

範囲使用できる範囲をすぐ忘れてしまうので自分のためにまとめてみました。

C# は int や double など、他の型のある言語で利用できる型がC#にも用意されています。組み込み型の特徴は以下の通りです。

  • .NETでは数値型のサイズは環境に依らず全て同じ
    • → 環境が変わってもサイズが変わらない
  • フィールドで初期化せずに宣言すると初期値は整数は「0」、浮動小数は「0.0」
  • 全て「値型」となる。← 後述

整数の組み込み型

整数を扱える組み込み型は以下の通りです。

type byte Signed 範囲
sbyte 1 Yes -128 ~ 127
byte 1 No 0 ~ 255
short 2 Yes -32768 ~ 32767
ushort 2 No 0 ~ 65535
int 4 Yes -2,147,483,648 ~ 2,147,483,647
uint 4 No 0 ~ 4,294,967,295
long 8 Yes -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
ulong 8 No 0 ~ 18,446,744,073,709,551,615

符号なし8バイト「ulong」になると、日本語で表記した場合、1844京(1兆の1000倍が1京)という大変大きな数値を扱うことができます。

浮動小数点の組み込み型

小数が扱える組み込み型は以下の通りです。

type byte おおよそ範囲 有効桁数
float 4 -3.4 × 1038 ~ +3.4 × 1038 まで *1 7桁
double 8 ±5.0 × 10^−324 ~ ±1.7 × 10308 *2 15-16桁

有効桁を超えた計算を行うと計算結果が不正確になる可能性があるので、扱いたい数値がどの程度か意識する必要があ(るときがあ)ります。

その他の組み込み型

整数、小数以外の情報を表す型は以下の通りです。

type byte Signed 範囲
bool 存在しない 存在しない true / false
char 2 No U+0000 ~ U+FFFF (0 ~ FFFFと同じ)
string 存在しない 存在しない 存在しない
object 存在しない 存在しない 存在しない

C#のbool型はint等の型と互換がありません。代入できないので0がfalseという扱いも存在しません。明示的にキャストしても代入不可能です。

// boolは数値と互換性が無い
bool a = false;
int b = (int)a; // CS0030 型 'bool' を 'int' に変換できません

「charは2バイト」でC#では「1文字」を扱うための変数で他の整数とは区別されます。2バイトの整数はshort/ushortがあるので純粋に数値を扱うときはそちらを使用しましょう。

但し、整数と互換があるためキャストすれば数字でも代入できます。

// charはキャストすれば
char a = (char)0; // 0はintだけどキャストすれば代入可能

stringは特別で文字列を表します。値型だけど初期値がnullなのが特徴です。

object型は全ての型と互換があります。(全ての型が継承する基底クラスのため)従って、どのような値もobjectに代入することができます。

double d = 0.0
object a = d; // どんな型でも代入できる

値型はコピーとして渡される

値型はメソッドの引数などで渡すと値のコピーとして渡されます。以下例のように引数で値型を渡し、メソッド内で値を変更しても呼び出し元には反映されません。

public static void Main()
{
    int a = 0;
    Add(a);

    Console.WriteLine(a);
    // 【出力】
    // > 0
    // ★★★値は変わらない
}

public static void Add(int a)
{
    a = a + 10;
}

メソッド内の変更を共有したい場合refキーワードを以下のように使用します。

public static void Main()
{
    int a = 0;
    Add(ref a); // ref を付けて呼び出す

    Console.WriteLine(a);
    // 【出力】
    // > 10
    // ★★★値が変わる
}

public static void Add(ref int a) // refキーワード追加
{
    a = a + 10;
}

値型のNull許容型

値型は「Null許容型」というnullが代入できる型として宣言することができます。

int? a = null;

どんな時に使用するかというと、例えば以下のように、初期値はnullで値が未設定の場合と、何か設定済みで数字が入っている場合を区別する事ができるようになります。(ただし扱いが難しい{人によって認識が違う可能性がある}ため使用する場合扱いに注意が必要です。

主にDBの整数フィールドから取り出した内容がnullのだった場合、に使用できます。

int? a = null;
if(a == null)
{
    // 何かの処理
}

*1:MSDNより

*2:MSDNより