数値型 (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)0x61; // 'a'

char c4 = 'あ';
char c5 = '\u3042';     // 'あ'
char c6 = (char)0x3042; // 'あ'

\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: 文字リテラルに文字が多すぎます。

サロゲートペアは2つのCharで表現されるため、1つのCharには格納できません。

char ca = '😀'; // error CS1012: 文字リテラルに文字が多すぎます。

string s = "😀";
int length = s.Length; // 2
char s1 = s[0]; // 0xd83d
char s2 = s[1]; // 0xde00

コードポイントとの変換は、ConvertFromUtf32()とConvertToUtf32()で行えます。

string s = Char.ConvertFromUtf32(0x1f600); // "😀"

string str = "😀";
int codePoint = Char.ConvertToUtf32(str[0], str[1]); // 128512 (0x0001f600)

ASCIIコードとは、キャストまたはConvertのメソッドで変換できます。文字のASCII(アスキー)コードを得るには?[C#、VB]:.NET TIPS - @IT 遠藤孝信 (2007/03/22)

int n1 = (int)'a';             // 0x61
int n2 = Convert.ToInt32('a'); // 0x61

char c1 = (char)0x61;           // 'a'
char c2 = Convert.ToChar(0x61); // 'a'

char c3 = (char)('a' + 1); // 'b'

既定値 default(char) は'\0' (U+0000) です。char 型 - C# reference | Microsoft Learn

空文字列""のように、空文字''は記述できません。それはCS1011となります。c# - Why is there no Char.Empty like String.Empty? - Stack Overflow

IsWhiteSpace()

指定のUnicode文字が空白文字か判定できます。そのとき空白文字と判断されるのは、下表のUnicode文字です。

属するUnicodeCategory Unicode文字 Unicode値
SpaceSeparator SPACE U+0020
NO-BREAK SPACE U+00A0
OGHAM SPACE MARK U+1680
EN QUAD U+2000
EM QUAD U+2001
EN SPACE U+2002
EM SPACE U+2003
THREE-PER-EM SPACE U+2004
FOUR-PER-EM SPACE U+2005
SIX-PER-EM SPACE U+2006
FIGURE SPACE U+2007
PUNCTUATION SPACE U+2008
THIN SPACE U+2009
HAIR SPACE U+200A
NARROW NO-BREAK SPACE U+202F
MEDIUM MATHEMATICAL SPACE U+205F
IDEOGRAPHIC SPACE U+3000
LineSeparator LINE SEPARATOR character U+2028
ParagraphSeparator PARAGRAPH SEPARATOR character U+2029
  CHARACTER TABULATION U+0009
LINE FEED U+000A
LINE TABULATION U+000B
FORM FEED U+000C
CARRIAGE RETURN U+000D
NEXT LINE U+0085
Remarks - Char.IsWhiteSpace Method (System) | Microsoft Learn

Int32構造体

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

既定では算術オーバーフローは無視されるため、最大値を超えると予期せぬ結果となることがあります。

int a = int.MaxValue; //  2147483647 (0x7fffffff)
a++;                  // -2147483648 (0x80000000)

int b = int.MaxValue; //  2147483647
b *= 2;               // -2 (0xfffffffe)

文字列への変換

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

public string ToString(
    string format // 標準の数値書式指定文字列
)
ToString(String) - Int32.ToString メソッド (System) | Microsoft Learn
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"

桁区切りや小数点もカルチャに依存します。

int a = 1000 * 1000 * 1000;
string s1 = a.ToString("N"); // "1,000,000,000.00"
string s2 = a.ToString("N", CultureInfo.CreateSpecificCulture("en-US")); // "1,000,000,000.00"
string s3 = a.ToString("N", CultureInfo.CreateSpecificCulture("hi-IN")); // "1,00,00,00,000.00" (桁区切りは最初は3桁、後は2桁)
string s4 = a.ToString("N", CultureInfo.CreateSpecificCulture("de-DE")); // "1.000.000.000,00" (桁区切りはピリオド。小数点はカンマ)
string s5 = a.ToString("N", CultureInfo.CreateSpecificCulture("fr-FR")); // "1 000 000 000,00" (桁区切りはNARROW NO-BREAK SPACE (U+202F))
string s6 = a.ToString("N", CultureInfo.CreateSpecificCulture("ru-RU")); // "1 000 000 000,00" (桁区切りはNO-BREAK SPACE (U+00A0))

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進数)

変換する目的がユーザーに表示するためならばCultureInfo.CurrentCultureを、データベースなどへ格納するためならばCultureInfo.InvariantCultureを指定します。これを指定しないと「IFormatProvider を指定します (Specify IFormatProvider)」としてCA1305で警告されます。

文字列から数値への変換

整数リテラル (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
double d1 = 12.3456789;
d1.ToString();      // "12.3456789"
d1.ToString("F");   // "12.35"

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

整数同様に、桁区切りや小数点はカルチャに依存します。

double d2 = 1000.5555;
d2.ToString("N"); // "1,000.56"
d2.ToString("N", CultureInfo.CreateSpecificCulture("en-US")); // "1,000.56"
d2.ToString("N", CultureInfo.CreateSpecificCulture("hi-IN")); // "1,000.56"
d2.ToString("N", CultureInfo.CreateSpecificCulture("de-DE")); // "1.000,56"
d2.ToString("N", CultureInfo.CreateSpecificCulture("fr-FR")); // "1 000,56"
d2.ToString("N", CultureInfo.CreateSpecificCulture("ru-RU")); // "1 000,56"

Decimal構造体

おおよその範囲 有効桁数
decimal (-7.9x10²⁸ ~ 7.9x10²⁸) / (100 ~ 28) 28~29
// Decimal構造体の作成
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から検索