数値型 (Numeric types)

整数型 (Integral Types)

範囲 種類 ビット数
下限 上限
sbyte -128 127 符号付き整数 8
byte 0 255 符号なし整数 8
char U+0000 U+ffff Unicode文字 16
short -32,768 32,767
(0x7FFF)
符号付き整数 16
ushort 0 65,535
(0xFFFF)
符号なし整数 16
int -2,147,483,648 2,147,483,647
(0x7FFF FFFF)
符号付き整数 32
uint 0 4,294,967,295
(0xFFFF FFFF)
符号なし整数 32
long -9,223,372,036,854,775,808 9,223,372,036,854,775,807
(0x7FFF FFFF FFFF FFFF)
符号付き整数 64
ulong 0 18,446,744,073,709,551,615
(0xFFFF FFFF FFFF FFFF)
符号なし整数 64
整数型の一覧表 (C# リファレンス) | MSDN

Byte構造体

byte b1 = 0xff;
b1++; // 0x00 (算術オーバーフロー)

byte b2 = 0x00;
b2--; // 0xff (算術オーバーフロー)

型変換

int i = 0x110;
byte b = (byte)i; // 0x10 (オーバーフローする)
byte b1 = 0x80;
byte b2 = 0x80;

int c1 = b1 + b2; // 0x100 (intにキャストされて演算される)
byte c2 = b1 + b2; // error CS0266: 型 'int' を 'byte' に暗黙的に変換できません。明示的な変換が存在します

バイト配列 → 数値への変換

byte[] bytes = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
int a = BitConverter.ToInt32(bytes, 0); // 67305985 (0x04030201)
string hex = Convert.ToString(a, 16);   // "4030201"

bool b = BitConverter.ToBoolean(bytes, 0);  // true
double c = BitConverter.ToDouble(bytes, 0); // 5.447603722011605E-270
方法: バイト配列を int に変換する (C# プログラミング ガイド) | MSDN
public static int ToInt32(
    byte[] value,
    int startIndex
)
BitConverter.ToInt32 メソッド (Byte[], Int32) (System) | MSDN
異なるエンディアンへの対応

複数バイトのデータを数値へ変換するときにはシステムのアーキテクチャによって異なる結果となるため、バイトの並びを反転するなどの対処が必要です。

byte[] bytes = { 0xff, 0x01, 0x00, 0x00, 0x00, 0xff };

if (BitConverter.IsLittleEndian)
{
    Array.Reverse(bytes, 1, 4); // インデックス1から、4バイト分の並びを反転させる
}

int x = BitConverter.ToInt32(bytes, 1); // 0x01000000

数値 → バイト配列への変換

byte[] bytes = BitConverter.GetBytes(10); // { 0x0a, 0x00, 0x00, 0x00 }
public static byte[] GetBytes(
    int value
)
BitConverter.GetBytes メソッド (Int32) (System) | MSDN

バイト配列 → 16進文字列

byte[] data = new byte[] { 10, 20, 30 };

// 方法1:ToString()で変換した16進文字列を、StringBuilderで連結
StringBuilder stringBuilder = new StringBuilder(data.Length * 2);
foreach (byte item in data)
{
    stringBuilder.Append(item.ToString("X2"));
}
string hex1 = stringBuilder.ToString(); // 0A141E

// 方法2:BitConverterで変換したハイフン区切りの16進文字列の、ハイフンを削除
string hex2 = BitConverter.ToString(data).Replace("-", ""); // 0A141E

c# - How do you convert Byte Array to Hexadecimal String, and vice versa? - Stack Overflow

Char構造体

UTF-16で文字を表し、その値は16ビットの数値です。Char Struct (System) | Microsoft Learn

char c1 = 'a';
char c2 = '\u0061'; // 'a'

char c3 = 'あ';
char c4 = '\u3042'; // 'あ'

\uに続けるのはUnicodeエスケープ シーケンスであり、文字コードを4つの16進で表します。一方で\xは16進エスケープ シーケンスであり、こちらも文字コードを16進で表しますが、先頭の0を省略できます。Literals - char type - C# reference | Microsoft Learn

char c5 = '\x0061'; // 'a'
char c6 = '\x61';   // 'a'
char c7 = '\u61';   // error CS1009: 認識できないエスケープ シーケンスです。

char c8 = '\x3042';  // 'あ'
char c9 = '\x03042'; // error CS1012: 文字リテラルに文字が多すぎます。

Int32構造体

定数フィールド
フィールド 内容
MaxValue Int32で最大の有効値 2147483647
MinValue Int32で最小の有効値 -2147483648
     
フィールド - Int32 構造体 (System) | Microsoft Learn

文字列への変換

書式を指定して文字列に変換するならば、ToString()を呼びます。

public string ToString(
    string format // 標準の数値書式指定文字列
)
Int32.ToString メソッド (String) (System) | MSDN
int a = 123;

a.ToString();    // 123
a.ToString("N"); // 123.00
a.ToString("x"); // 7b

カルチャに依存する内容ならば、IFormatProviderでそれを指定します。

string s1 = 100.ToString("C"); // "¥100"
string s2 = 100.ToString("C", CultureInfo.CreateSpecificCulture("ja-JP")); // "¥100"
string s3 = 100.ToString("C", CultureInfo.CreateSpecificCulture("en-US")); // "$100.00"
string s4 = 100.ToString("C", CultureInfo.CreateSpecificCulture("en-GB")); // "£100.00"

10進や16進以外の記法で出力するには、Convert.ToString()を呼びます。

public static string ToString(
    int value,
    int toBase // 基数
)
Convert.ToString メソッド (Int32, Int32) (System) | MSDN Convert.ToString メソッド (System) | MSDN
int a = 123;

Convert.ToString(a);     // 123
Convert.ToString(a, 2);  // 1111011 (2進数)
Convert.ToString(a, 16); // 7b      (16進数)

文字列から数値への変換

整数リテラル (Integer literals)

var a = 10;          // int
var b = 10U;         // uint
var c = 4294967295U; // uint  (0x0FFFFFFFF)
var d = 4294967296U; // ulong (0x100000000)

var e = 9223372036854775807L; // long  (0x7FFFFFFFFFFFFFFF)
var f = 9223372036854775808L; // ulong (0x8000000000000000)
サフィックス
なし int、uint、long、ulongの順で、その値を表すことができる最初の型
U または u uint、ulongの順で、その値を表すことができる最初の型
L または l long、ulongの順で、その値を表すことができる最初の型
UL、ul、LU または lu ulong型
2.4.4.2 Integer literals (C#) | MSDN
プレフィックス  
なし 10進
0x または 0X 16進
0b または 0B  2進 (C# 7.0以降)
uint i1 = 0x00000001;
int i2 = 0x00000001;

Console.WriteLine(i1); // 1
Console.WriteLine(i2); // 1


uint u1 = 0xFFFFFFFF;
int u2 = 0xFFFFFFFF; // error CS0266
int u3 = (int)0xFFFFFFFF; // error CS0221
int u4 = unchecked((int)0xFFFFFFFF);

Console.WriteLine(u1); // 4294967295
Console.WriteLine(u4); // -1

浮動小数点型 (Floating-Point Types)

おおよその範囲 有効桁数
float ±1.5x10⁻⁴⁵ ~ ±3.4x10³⁸ 7
double ±5.0x10⁻³²⁴ ~ ±1.7x10³⁰⁸ 15~16
浮動小数点型の一覧表 (C# リファレンス) | MSDN

Double構造体

定数フィールド
フィールド 内容
Epsilon ゼロより大きい最小のDouble値
MaxValue Doubleの最大有効値
MinValue Doubleの最小有効値
NaN 非数 (NaN) の値
PositiveInfinity 正の無限大
NegativeInfinity 負の無限大
フィールド - Double 構造体 (System) | Microsoft Learn
double r1 = 0.0 / 0.0; // NaN
Double.IsNaN(r1); // true
bool b1 = r1 == double.NaN // false

double r2 =  1.0 / 0.0; // Infinity
double r3 = -1.0 / 0.0; // -Infinity
Double.IsInfinity(r2); // true
Double.IsInfinity(r3); // true
Double.IsPositiveInfinity(r2); // true
Double.IsPositiveInfinity(r3); // false

非数の判定

public static bool IsNaN (double d);
Double.IsNaN(Double) メソッド (System) | Microsoft Learn

このメソッドは、次のように実装されています。

[Pure]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[System.Security.SecuritySafeCritical]
[System.Runtime.Versioning.NonVersionable]
public unsafe static bool IsNaN(double d)
{
    return (*(UInt64*)(&d) & 0x7FFFFFFFFFFFFFFFL) > 0x7FF0000000000000L;
}
IsNaN - double.cs

文字列への変換

public string ToString(
    string format // 数値書式指定文字列
)
Double.ToString メソッド (String) (System) | MSDN
(12.3456789).ToString();      // "12.3456789"
(12.3456789).ToString("F");   // "12.35"

(12.3456789).ToString("F0");  // "12"
(12.3456789).ToString("F5");  // "12.34568"
(12.3456789).ToString("F10"); // "12.3456789000"

Decimal構造体

おおよその範囲 有効桁数
decimal (-7.9x10²⁸ ~ 7.9x10²⁸) / (100 ~ 28) 28~29
Decimal a1 = new Decimal(1.0);
decimal a2 = new decimal(1.0); // 名前の簡略化
decimal a3 = 1.0m;             // リテラル

double b = Decimal.ToDouble(a1);

実数リテラル (Real literals)

接尾辞
float F または f
double D または d
decimal M または m
2.4.4.3 Real literals (C#) | MSDN

算術オーバーフロー (Arithmetic Overflow)

既定では算術オーバーフローは無視されますが、コンパイル時に/checkedオプションを付けることで例外を発生するように変更できます。算術オーバーフロー - C# 演算子 | Microsoft Learn

その状態ではSystem.OverflowExceptionが発生し、「算術演算の結果オーバーフローが発生しました。」と通知されます。

/checkedオプションは、Visual Studioではプロジェクトのプロパティの【ビルド → 詳細設定】の[演算のオーバーフローおよびアンダーフローのチェック]を有効にすることで指定できます。-checked (C# コンパイラ オプション) | Microsoft Learn

checked

checkedキーワードを指定することで、特定の式またはブロックだけでオーバーフローが検出されるようにできます。checked キーワード - C# リファレンス | Microsoft Learn

int a = int.MaxValue;
int b;

b = checked(a + 1); // checked式

checked // checkedブロック
{
    b = a + 1;
}

unchecked

checkedとは逆に、オーバーフローを検出しないようにできます。これによりオーバーフローが発生したときには、上位ビットが破棄されるようになります。

int Result;
if (Result == 0xFFFFFFFF) { } // warning CS0652: 整数定数への比較ができません。定数が型 'int' の範囲外です。

if (Result == unchecked((int)0xFFFFFFFF)) { }
Microsoft Learnから検索