型 | 範囲 | 種類 | ビット数 | |
---|---|---|---|---|
下限 | 上限 | |||
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)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
指定の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 |
フィールド | 内容 | 値 |
---|---|---|
MaxValue | Int32で最大の有効値 | 2147483647 (231-1) |
MinValue | Int32で最小の有効値 | -2147483648 (-231) |
既定では算術オーバーフローは無視されるため、最大値を超えると予期せぬ結果となることがあります。
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で警告されます。
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
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 | (-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);
型 | 接尾辞 |
---|---|
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)) { }