型 | 範囲 | 種類 | ビット数 | |
---|---|---|---|---|
下限 | 上限 | |||
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 |
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
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
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: 文字リテラルに文字が多すぎます。
フィールド | 内容 | 値 |
---|---|---|
MaxValue | Int32で最大の有効値 | 2147483647 |
MinValue | Int32で最小の有効値 | -2147483648 |
書式を指定して文字列に変換するならば、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進数)
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型 |
プレフィックス | |
---|---|
なし | 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
型 | おおよその範囲 | 有効桁数 |
---|---|---|
float | ±1.5x10⁻⁴⁵ ~ ±3.4x10³⁸ | 7 |
double | ±5.0x10⁻³²⁴ ~ ±1.7x10³⁰⁸ | 15~16 |
フィールド | 内容 |
---|---|
Epsilon | ゼロより大きい最小のDouble値 |
MaxValue | Doubleの最大有効値 |
MinValue | Doubleの最小有効値 |
NaN | 非数 (NaN) の値 |
PositiveInfinity | 正の無限大 |
NegativeInfinity | 負の無限大 |
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 | (-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);
型 | 接尾辞 |
---|---|
float | F または f |
double | D または d |
decimal | M または m |
既定では算術オーバーフローは無視されますが、コンパイル時に/checkedオプションを付けることで例外を発生するように変更できます。算術オーバーフロー - C# 演算子 | Microsoft Learn
その状態ではSystem.OverflowExceptionが発生し、「算術演算の結果オーバーフローが発生しました。」と通知されます。
/checkedオプションは、Visual Studioではプロジェクトのプロパティの【ビルド → 詳細設定】の[演算のオーバーフローおよびアンダーフローのチェック]を有効にすることで指定できます。-checked (C# コンパイラ オプション) | Microsoft Learn
checkedキーワードを指定することで、特定の式またはブロックだけでオーバーフローが検出されるようにできます。checked キーワード - C# リファレンス | Microsoft Learn
int a = int.MaxValue; int b; b = checked(a + 1); // checked式 checked // checkedブロック { b = a + 1; }
checkedとは逆に、オーバーフローを検出しないようにできます。これによりオーバーフローが発生したときには、上位ビットが破棄されるようになります。
int Result; if (Result == 0xFFFFFFFF) { } // warning CS0652: 整数定数への比較ができません。定数が型 'int' の範囲外です。 if (Result == unchecked((int)0xFFFFFFFF)) { }