雑記
 

C# のデータ型

2021/4/4

→ Visual Basic の情報に切り替える

この記事が対象とする製品・バージョン

VS2019 C# 9.0 (2020年11月) 対象です。
VS2019 C# 8.0 (2019年9月) 対象です。
VS2017 C# 7.3 (2017年11月) 対象です。
VS2017 C# 7.2 (2017年8月) 対象です。
VS2017 C# 7.1 (2017年3月) 対象です。
VS2015 C# 6.0 (2015年7月) 対象です。
VS2012 C# 5.0 (2012年8月) 対象です。
VS2010 C# 4.0 (2010年4月) 対象です。
VS2008 C# 3.0 (2007年11月) 対象です。
VS2005 C# 2.0 (2005年11月) 対象です。
VS.NET 2003 C# 1.2 (2003年4月) 対象です。
VS.NET 2003 C# 1.1 (2003年4月) 対象です。
VS.NET 2002 C# 1.0 (2002年1月) 対象です。

目次

 

型の基本情報

小数…小数が表現できるかを示しています。

正確…正確な値を示すことができるかを表しています。×の場合は値に誤差が発生しますので、金額の計算など値の正確さが重要な場合は使用できません。

C# 名称
読み方
小数 正確 値の範囲
bool 論理型
ブール
- - true または false
byte バイト型
バイト
× 0 ~ 255
char 文字型
キャラ
- - 1つのUnicodeのコードポイント
※多くの文字は1つのコードポイントで1文字ですが、複数のコードポイントで1文字を表す場合もあります。
※数値に変換すると0 ~ 65535ですが数値用ではありません。
short 短整数型
ショート
× -32768 ~ 32767
int 整数型
イント
× -2147483648 ~ 2147483647
long 長整数型
ロング
× -9223372036854775808 ~ 9223372036854775807
sbyte 符号付きバイト型
エスバイト
× -128 ~ 127
ushort 符号なし短整数型
ユーショート
× 0 ~ 65535
uint 符号なし整数型
ユーイント
× 0 ~ 4294967295
ulong 符号なし長整数型
ユーロング
× 0 ~ 18446744073709551615
nint ネイティブサイズの整数
エヌイント
× C# 9.0(2020年11月) 以降で使用可能。
32ビット プラットフォームの場合 int と同じ範囲。
-2147483648 ~ 2147483647

64ビット プラットフォームの場合 long と同じ範囲。
-9223372036854775808 ~ 9223372036854775807
nuint ネイティブサイズの符号なし整数
エヌユーイント
× C# 9.0(2020年11月) 以降で使用可能。
32ビット プラットフォームの場合 uint と同じ範囲。
0 ~ 4294967295

64ビット プラットフォームの場合 ulong と同じ範囲。
0 ~ 18446744073709551615
decimal 十進型
デシマル
※小数の桁数によって異なります。

・小数の桁数が0の場合
-79228162514264337593543950335 ~ 79228162514264337593543950335

・小数の桁数が28桁の場合
-7.9228162514264337593543950335 ~ 7.9228162514264337593543950335

・一番細かい値(分解能)
0.0000000000000000000000000001

float 単精度浮動小数点型
フロート
× -340282350000000000000000000000000000000
~ 340282350000000000000000000000000000000

一番細かい値(分解能)
0.00000000000000000000000000000000000000000001401298

double 倍精度浮動小数点型
ダブル
× -17976931348623157000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
0000000000000000000000000

179769313486231570000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000

一番細かい値(分解能)
0.00000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000494065645841246544

object オブジェクト型
オブジェクト
- - (任意の型を格納できます)
string 文字列型
ストリング
- - 0 個 ~ 約 20 億個の文字 (厳密にはUnicodeのコードポイント)

メモ:C# には日付型はありません。フレームワークで用意されている DateTime構造体を使用します。

 

数値にはどれを使うべきか?

通常は次のように使い分けてください。

  使用する型
整数 int
もっと桁数の大きい整数 long
さらに桁数の大きい整数
または、
小数部分がある数値
decimal

 

これで何か問題がある場合は、個別に検討します。いくつかのケースを紹介します。

この表にはのC#型ではありませんが、フレームワークで定義されている方もいくつか載せています。たとえば、無限の桁数の数値が必要な場合はフレームワークのBigIntegerが使用できます。

金額・数量 decimal
科学的な計算(細かい誤差が許容できる場合) double
文字コード char
巨大な桁数の数値(小数あり、誤差あり) double
桁数に制限がない数値 System.Numerics.BigInteger
APIなど外部と連携 int
バイナリーデータ byte
日付・時刻 System.DateTime
期間 System.TimeSpan
平面座標 System.Drawing.Point または System.Drawing.PointF
虚数・複素数 System.Numerics.Complex
位置情報(緯度、経度、高度) System.Device.Location.GeoCoordinate
平面ベクトル System.Numerics.Vector2
空間ベクトル System.Numerics.Vector3

 

 

誤差の例

正確列 が × の場合の誤差の例

下記の例では、0.05 を 10回 たし算するので、結果は 0.5 になることを期待しますが、実際には 0.5 にはなりません。

float value = 0.05F; //末尾の F は値が float であることを示しています。

value += 0.05F; // 0.05 × 2 = 0.1  になることを期待
value += 0.05F; // 0.05 × 3 = 0.15 になることを期待
value += 0.05F; // 0.05 × 4 = 0.2  になることを期待
value += 0.05F; // 0.05 × 5 = 0.25 になることを期待
value += 0.05F; // 0.05 × 6 = 0.3  になることを期待
value += 0.05F; // 0.05 × 7 = 0.35 になることを期待
value += 0.05F; // 0.05 × 8 = 0.4  になることを期待
value += 0.05F; // 0.05 × 9 = 0.45 になることを期待
value += 0.05F; // 0.05 × 10= 0.5  になることを期待

System.Diagnostics.Debug.WriteLine(value); //0.50000006 と出力されます。

 

 

その他の情報

C#の型 フレームワークの型 サイズ
(バイト)
実数リテラルの
サフィックス ※3
実数リテラルの記述例 備考
bool System.Boolean ※1   true または false  
byte System.Byte 1   1  
char System.Char 2   '字' または '\u5B57'  
short System.Int16 2   1  
int System.Int32 4   1 パフォーマンスが良いことが多い。(特に32ビットCPUの場合)
long System.Int64 8 L 1L  
nint System.IntPtr 4 または 8 ※2   1  
nuint System.UIntPtr 4 または 8 ※2   1  
sbyte System.SByte 1   1  
ushort System.UShort 2   1  
uint System.UInt 4 U 1U  
ulong System.ULong 8 U または L または UL 1UL  
decimal System.Decimal 16 M 1M 数値の中でパフォーマンスが最も悪い。
0 を除いた場合の絶対値の最小値は
0.0000000000000000000000000001 (1E-28)
float System.Single 4 F 1.0F 値の範囲
負の場合:-3.4028235E+38 ~ -1.401298E-45
正の場合:1.401298E-45 ~ 3.4028235E+38
double System.Double 8 D 1.0D 値の範囲

負の場合:
-1.79769313486231570E+308 ~ -4.94065645841246544E-324

正の場合:
4.94065645841246544E-324 ~ 1.79769313486231570E+308

object System.Object 4 または 8 ※2      
string System.String ※1   "文字列"  

サイズは情報量のサイズです。実際に使用する物理メモリのサイズではありません。

※1 プラットフォームによってサイズが異なります。

※2 32ビットのプラットフォームの場合4バイト、64ビットの場合8バイト。

※3 大文字と小文字の区別はありません。たとえば、 uL も Ul も ulong を表します。

 

参考

Types - C# language specification | Microsoft Docs