プログラミング言語にあらかじめ用意されている変数の型を組込み型といいます。 C# には以下のような組込み型が用意されています。
| 符号付き | 符号無し | |||
|---|---|---|---|---|
| 数値型 | 整数型 | 8ビット整数 |
sbyte
|
byte
|
| 16ビット整数 |
short
|
ushort
| ||
| 32ビット整数 |
int
|
uint
| ||
| 64ビット整数 |
long
|
ulong
| ||
| 文字型 | char | |||
| 浮動小数点型 | 単精度 |
float
| ||
| 倍精度 |
double
| |||
| デシマル(10進小数) |
decimal
| |||
| 論理値型 |
bool
| |||
| 文字列型 |
string
| |||
| オブジェクト型 |
object
| |||
数学では無限の桁数の数字を扱えますが、コンピュータの内部では値を記憶しておく場所が限られているため、扱える値の範囲も限られています。 当然、桁の大きな値ほど大きな記憶領域を必要とします。 また、符号の有無によっても扱える値の範囲は変わります。
以下にC#の整数型の一覧を挙げます。
| 型名 | 記憶領域サイズ | 符合の有無 | 扱える値の範囲 |
|---|---|---|---|
byte
| 1バイト | なし | 0 ~ 255 |
sbyte
| 1バイト | あり | -128 ~ 127 |
short
| 2バイト | あり | -32,768 ~ 32,767 |
ushort
| 2バイト | なし | 0 ~ 65,535 |
int
| 4バイト | あり | -2,147,483,648 ~ 2,147,483,647 |
uint
| 4バイト | なし | 0 ~ 4,294,967,295 |
long
| 8バイト | あり | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
ulong
| 8バイト | なし | 0 ~ 18,446,744,073,709,551,615 |
int は integer (整数)の略で、short と long の意味は名前通り、記憶領域サイズの長い/短いの違いです。
byte も名前通りで「1バイトの変数」という意味です。
sbyte の「s」は signed の s で符号付きを意味します。
また、uint, ushort, ulong の「u」は unsigned の u で符号無しを意味します。
C# のソースコード中に直接整数値を書き込むと整数リテラルとみなされます。
また、整数値の後ろに「u」か「U」を付けると符号なし整数とみなされ、
「l」か「L」を付けると long 型のリテラルとみなされます。
int k = 351; // 整数リテラル uint l = 86U; // 符号なし long m = 1879L; // Lを付けるとlongとみなされる ulong n = 2419UL; // UとLを付けるとulongとみなされる
コンピュータは基本的に数値しか扱えません。 そのため、文字もコンピュータの内部では整数値として扱われています。 どの文字に対して何番の数字を割り当てるかは、標準化団体によって取り決めがなされています。 このような取り決めによって文字に割り当てられた整数値を文字コードといいます。
C# では Unicode という2バイトの文字コードが使われています。
(正確には UCS-2。サロゲートなしの UTF-16。残念ながら、UTF-32/UCS-4 には未対応。)
そのため、C# の文字型
char
(characterの略)は2バイトの数値として扱われます。
文字リテラルは
といったように ' (シングルクォーテーション)で囲んで表現します。
また、' 自身を表す文字リテラルは
というように書きます。
この \ 記号とそれに続く文字はエスケープシーケンスと呼ばれ、特殊な意味を持ちます。
以下に主なエスケープシーケンスの種類と意味を挙げます。
| エスケープシーケンス | 意味 |
|---|---|
\n
| 改行文字 |
\t
| タブ |
\'
| ' (シングルクォーテーション) |
\"
| " (ダブルクォーテーション) |
\\
| \ 自身 |
\uXXXX
| UnicodeがXXXXの文字 (XXXXの部分には4桁の16進数が入る) |
char c = 'a'; // 文字リテラル
整数型のところでも述べたように、コンピュータの中では有限桁の数しか扱えませんので、 厳密にはコンピュータの中で「実数型」というものは扱うことが出来ません。 しかし、科学技術計算などでは、非常に大きな数や、非常に小さな数を扱いたい場面がしばしばあります。
そこで、「1.4982654×1058」というように、 指数表記を使って数を表すことを考えます。 こうすることで、非常に大きな数や、非常に小さな数を限られた桁数で表現することが出来ます。 この方法では、小数点の位置を変えて数を表現するので、このような形式の数を浮動小数点数(floating point number)といいます。 コンピュータの内部では、実数はこのように浮動小数点数として(近似的に)扱われています。
以下にC#の浮動小数点型の一覧を挙げます。
| 型名 | 記憶領域サイズ | 精度 | 扱える値の範囲 |
|---|---|---|---|
float
| 4バイト | 7桁 | ±1.5 × 10-45 ~ ±3.4 × 1038 |
double
| 8バイト | 15桁 | ±5.0 × 10-324 ~ ±1.7 × 10308 |
floatは floating-point (浮動小数点)の略で、doubleは double-precision floating-point (倍精度浮動小数点)という意味です。
C# のソースコード中に小数を書き込むと浮動小数点リテラルとみなされます。
数値の後ろに「f」か「F」を付けると float 型とみなされ、
「d」か「D」を付けると double 型とみなされ、
また、浮動小数点リテラルは指数表記(2.56×104といった形式。2.56の部分を仮数部、10の肩に乗っている4のことを指数部といいます)でも書くことが出来ます。
指数表記のリテラルの書き方は [仮数部]e[指数部] (例えば、2.56×104は2.56e4と書く)です。
double x = 2.2362; // 浮動小数点リテラル float y = 2.7183f; // fを付けると単精度 double z = 6.02e23; // 指数表記 6.02×10^23
float や double などの不動小数点数は、コンピュータの内部では2進小数になっています。 表1に、2進小数と10進小数の対応関係の例をいくつか挙げます。
表1: 2進小数と10進小数
| 2進小数 | 10進小数 |
|---|---|
| 0.1 | 0.5 |
| 0.01 | 0.25 |
| 0.11 | 0.75 |
| 0.001 | 0.125 |
| 0.000110011… | 0.1 |
これで何が問題になるかというと、 実は、(10進数での)0.1 すら、不動小数点数では正確に(有限桁で)表すことができません。
元々誤差がつき物な科学技術計算などではこれが問題になることもないんですが、 例えば、金融などの分野では、「1.1ドル(1ドル10セント)」が正確に表せないとなると大問題になります。
そこで、C# では10進小数を表すための decimal という型が用意されています。
decimal m = 99.9m; // mを付けるとdecimalになる
一見、浮動小数点と似ていますが(小数点の位置が動くという意味では decimal も浮動小数点なんですが)、 float、double と比べて以下のような特徴があります。
float や double と比べて、精度が高い代わりに、表現できる数の範囲が狭い(つまり、指数部の桁が少ない)
表現できる数の範囲を以下に示します(比較のため、改めて浮動小数点数の値の範囲も示します)。
| 型名 | 記憶領域サイズ | 精度 | 扱える値の範囲 |
|---|---|---|---|
float
| 4バイト | 7桁 | ±1.5 × 10-45 ~ ±3.4 × 1038 |
double
| 8バイト | 15桁 | ±5.0 × 10-324 ~ ±1.7 × 10308 |
decimal
| 16バイト | 28桁 | 1.0 × 10-28 ~ 7.9 × 1028 |
double 型と比べて、大きな数を表すことは出来ない代わりに、表現できる桁数が多くなっています。
そのため、float や double とはまったくの別物として扱われ、
互いに暗黙的な型変換ができなくなっています。
小数の後ろに「m」か「M」を付けると decimal 型とみなされます。
decimal m = 99.9m; // mを付けるとdecimalになる
論理値とは条件式が正しいか間違っているかをあらわすものです。 正しい状態(真または true という)と、 間違った状態(偽または false という)の2つの値を持ちます。
C# では論理値型は
bool
(boolean の略。論理代数を考案した George Bool という人物にちなんで論理値のことを英語で boolean という)といいます。
論理値リテラルは真を表す
true
と、
偽を表す
false
の2つです。
bool b = x==1; // x が 1 ならば true 、そうでなければ false になる。 bool t = true; // 直接 true を代入 bool f = false; // 直接 false を代入
ちなみに、1行目を見ての通り、== などの比較演算の結果は bool 値になります。
文字列は名前通り、文字の列なわけですから、
char
型の配列で十分な気もします。
実際、C言語などのプログラミング言語では文字列は char 型の配列として扱われています。
しかし、文字列には、連結、検索、置換、数値への変換など、文字の配列には無い機能が必要になります。
そのため、C# では
string
という文字列用の型が用意されています。
文字列リテラルは
といったように " (ダブルクォーテーション)で囲んで表現します。
また、文字列リテラル中で " を使うためには、
文字リテラル中の'と同様にエスケープシーケンスを使って
というように表現します。
また、
というように、
'' や "" の前に @ (アットマーク)を付けると \ とそれに続く文字がエスケープシーケンスとはみなされず、
普通に \ 記号として解釈されます。これを @-quoted string といいます。
string s = "C#入門"; // 文字列リテラル string x = "\uff9f\u0434\uff9f"; // Unicodeを直入力。 ゚д゚ ←これ。 string path = @"C:\windows\system"; // @-quoted string。 \ 記号がそのまま解釈される。
ちなみに、@-quoted 文字列の場合、複数行に渡る文章を書くことも出来ます。 改行の位置にはちゃんと改行文字が入ります。
string multiLineString = @"@-quoted string では、 文章を複数行に渡って書くことができます。 "; Console.Write(multiLineString);
こういう書き方のことを here 文字列と言ったりもします。 (エスケープなし、改行も含めて全部見たまま「ここに書いた通り」という意味。)
object はオブジェクト型と呼ばれ、任意の型の値を格納できる型です。
C# では、組込み型・ユーザー定義型を問わずすべての型は object から派生しています。
(ユーザー定義型や派生については後ほど説明します。)
C# の組込み型は .NET Framework で定義されている型の別称になっています。 (頻繁に使うので、C# の予約後として省略形を提供している。) 以下に、C# の組込み型名と .NET Framework で定義されている型との対応表を示します。
| C# | .NET Framework |
|---|---|
bool
|
System.Boolean
|
byte
|
System.Byte
|
sbyte
|
System.SByte
|
short
|
System.Int16
|
ushort
|
System.UInt16
|
int
|
System.Int32
|
uint
|
System.UInt32
|
long
|
System.Int64
|
ulong
|
System.UInt64
|
char
|
System.Char
|
float
|
System.Single
|
double
|
System.Double
|
decimal
|
System.Decimal
|
string
|
System.String
|
object
|
System.Object
|
演習問題は 「組込み演算子」 まで説明した後でまとめて行います。