<2> データの概念: 単純型 (標準 Pascal 範囲内での Delphi 入門)

# 2. データの概念: 単純型 (Simple Types)

**単純型 (単純データ型)** には **順序型 (順序データ型)** と **実数型** があります。

標準 Pascal の**順序型**にはユーザーが定義した[列挙型](https://qiita.com/ht_deko/items/335e59857cc78aea951a#51-%E5%88%97%E6%8C%99%E5%9E%8B)や[部分範囲型](https://qiita.com/ht_deko/items/335e59857cc78aea951a#52-%E9%83%A8%E5%88%86%E7%AF%84%E5%9B%B2%E5%9E%8B)の他に、定義済みの **Boolean**, **Integer**, **Char** 等の型があります。

## 2.1. 順序型 (Ordinal Types)
**順序型 (順序データ型)** は値の前後に値のある型です。すべての順序型には **関係演算子**  `=`, `<>`, `<`, `<=`, `>=`, `>` が使えます。また、次の[標準関数](https://qiita.com/ht_deko/items/15b27e00fac9d723d9f0#%E6%A8%99%E6%BA%96%E9%96%A2%E6%95%B0-required-functions)も順序型で使えます。

|関数|パラメータ|説明|
|:---|:---|:---|
|[Succ()](http://docwiki.embarcadero.com/Libraries/ja/System.Succ)|順序型の式|式の値の一つ次の値|
|[Pred()](http://docwiki.embarcadero.com/Libraries/ja/System.Pred)|順序型の式|式の値の一つ前の値|
|[Ord()](http://docwiki.embarcadero.com/Libraries/ja/System.Ord)|順序型の式|式の値の順序値|

Delphi では次の組み込みルーチンも使えます。

|関数|パラメータ|説明|
|:---|:---|:---|
|[High()](http://docwiki.embarcadero.com/Libraries/ja/System.High)|順序型の型識別子または<br>順序型の変数|型の最大の値|
|[Low()](http://docwiki.embarcadero.com/Libraries/ja/System.Low)|順序型の型識別子または<br>順序型の変数|型の最小の値|
|[Inc()](http://docwiki.embarcadero.com/Libraries/ja/System.Inc)|順序型の変数|順序型変数の値を<br>インクリメント|
|[Dec()](http://docwiki.embarcadero.com/Libraries/ja/System.Dec)|順序型の変数|順序型変数の値を<br>デクリメント|

**Inc()**、**Dec()** は C 言語の ++ / += や -- / -= に相当します [^1]。

```pascal
  Inc(i);      // i++;
  Inc(i, 3);   // i+=3;
  Dec(i);      // i--;
  Dec(i, 5);   // i-=5;
``` 

## 2.2. Boolean 型 (Boolean Types)
**Boolean** 型は**論理型**の一つです。論理値は定義済みの定数 **True** および **False** で表されます。順序値が 1 の場合には **True**、順序値が 0 の場合には **False** であると見なされます。

次の論理演算子を論理型に使うと論理値を返します。

|論理演算子|説明|
|:---|:---|
|**and**|論理積 (AND)|
|**or**|論理和 (OR)|
|**not**|否定 (NOT)|

**関係演算子** `=`, `<>`, `<`, `<=`, `>=`, `>`, `in` を使った場合にも論理値を返します。例えば `A <> B` は排他的論理和 (XOR) になります。なお、Delphi には **xor** 論理演算子も用意されています。

|論理演算子|説明|
|:---|:---|
|**xor**|排他的論理和 (xor)|

次の[標準関数](https://qiita.com/ht_deko/items/15b27e00fac9d723d9f0#%E6%A8%99%E6%BA%96%E9%96%A2%E6%95%B0-required-functions)は論理型の値を返します。

|関数|パラメータ|説明|
|:---|:---|:---|
|[Odd()](http://docwiki.embarcadero.com/Libraries/ja/System.Odd)|整数型の変数または<br>整数値|値が奇数のときに True を返す|
|[Eoln()](http://docwiki.embarcadero.com/Libraries/ja/System.Eoln)|ファイル型変数|行の終わり。[9 章](https://qiita.com/ht_deko/items/986fa01c9e6cfc3fd673)で述べる|
|[Eof()](http://docwiki.embarcadero.com/Libraries/ja/System.Eof)|ファイル型変数|ファイルの終わり。[9 章](https://qiita.com/ht_deko/items/986fa01c9e6cfc3fd673)で述べる|

Delphi には他に **ByteBool**, **WordBool**, **LongBool** という論理型があります。これらの論理型は順序値がゼロ以外 (非ゼロ) の場合、**True** とみなされます。`Ord(LongBool(True))` は `1` ではなく `-1` を返します。これは他言語との互換性のために用意された型だからです。

**See also:**

 - [論理型 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E5%8D%98%E7%B4%94%E5%9E%8B%EF%BC%88Delphi%EF%BC%89#.E8.AB.96.E7.90.86.E5.9E.8B)
 - [System.Boolean (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.Boolean)

## 2.3. Integer 型 (Integer Types)
**Integer** 型は**整数型**の一つです。整数型は整数の部分集合を表します。次の論理演算子を整数型に使うと整数値を返します。

|算術演算子|説明|
|:---|:---|
|*|乗算|
|**div**|整数除算|
|**mod**|剰余|
|+|加算|
|-|減算|

※ 整数同士の除算に用いられる演算子は `/` ではなく `div` です。

Delphi では次の論理 (ビット) 演算子も使えます。

|論理 (ビット) 演算子|説明|
|:---|:---|
|**and**|ビット論理積|
|**or**|ビット論理和|
|**not**|ビット否定|
|**xor**|ビット XOR|
|**shr**|ビット右シフト|
|**shl**|ビット左シフト|


次の[標準関数](https://qiita.com/ht_deko/items/15b27e00fac9d723d9f0#%E6%A8%99%E6%BA%96%E9%96%A2%E6%95%B0-required-functions)は整数型の値を返します。

|関数|パラメータ|説明|
|:---|:---|:---|
|[Abs()](http://docwiki.embarcadero.com/Libraries/ja/System.Abs)|整数型の変数または整数値|値の絶対値を返す|
|[Sqr()](http://docwiki.embarcadero.com/Libraries/ja/System.Sqr)|整数型の変数または整数値|値の 2 乗を返す|
|[Trunc()](http://docwiki.embarcadero.com/Libraries/ja/System.Trunc)|実数型の変数または実数値|値の整数部を返す|
|[Round()](http://docwiki.embarcadero.com/Libraries/ja/System.Round)|実数型の変数または実数値|値を丸めた整数を返す|
|[Succ()](http://docwiki.embarcadero.com/Libraries/ja/System.Succ)|整数型の変数|値の一つ次の値を返す|
|[Pred()](http://docwiki.embarcadero.com/Libraries/ja/System.Pred)|整数型の変数|値の一つ前の値を返す|

定義済み定数に **MaxInt** があり、その値は処理系依存です。Integer が 32 ビットとは限りません。

Delphi にはプラットフォーム依存の整数型として **NativeInt**, **NativeUInt**, **LongInt**, **LongWord** があります。

Delphi のプラットフォーム非依存の整数型には、**ShortInt**, **SmallInt**, **LongInt**, **Integer**, **Int64**, **Byte**, **Word**, **LongWord**, **Cardinal**, **UInt64** があります。 

**See also:**

 - [整数型 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E5%8D%98%E7%B4%94%E5%9E%8B%EF%BC%88Delphi%EF%BC%89#.E6.95.B4.E6.95.B0.E5.9E.8B)
 - [System.Integer (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.Integer)

## 2.4. Char 型 (Character Types)
**Char** 型は**文字型**の一つです。文字集合が処理系依存のため、例えば次の関係が常に成り立つとは限りません。

```pascal
'@' > '#'
```

変換関数として次の[標準関数](https://qiita.com/ht_deko/items/15b27e00fac9d723d9f0#%E6%A8%99%E6%BA%96%E9%96%A2%E6%95%B0-required-functions)が使えます。

|関数|パラメータ|説明|
|:---|:---|:---|
|[Ord()](http://docwiki.embarcadero.com/Libraries/ja/System.Ord)|文字型の変数または<br>文字定数|現在の文字集合での順序数を返す|
|[Chr()](http://docwiki.embarcadero.com/Libraries/ja/System.Chr)|順序型の変数または<br>順序数|順序数をもつ文字を返す|

Delphi の文字型には他に **AnsiChar**, **WideChar**, **UCS2Char**, **UCS4Char** があります。

また、Delphi には **ANSI 版 Delphi (Delphi 2007 以前)** と **Unicode 版 Delphi (Delphi 2009 以降)** がありそれぞれで Char 型の定義が異なります [^1]。

|Delphi|Char|AnsiChar|WideChar|
|:---|:---:|:---:|:---:|
|ANSI 版|8 ビット|8 ビット|16 ビット|
|Unicode 版|16 ビット|8 ビット|16 ビット|

標準 Pascal の Char は現行の Delphi だと **AnsiChar** に相当します。

**See also:**

 - [文字型 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E5%8D%98%E7%B4%94%E5%9E%8B%EF%BC%88Delphi%EF%BC%89#.E6.96.87.E5.AD.97.E5.9E.8B)
 - [System.Char (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.Char)
 - [System.AnsiChar (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.AnsiChar)

## 2.5. Real 型 (Real Types)
**Real** 型は**実数型**の一つです。単純型の中で唯一順序型ではありません。Real 型のサイズや精度は実装依存です。

次の算術演算子の少なくとも片方の項が実数型の場合、実数値を返します。

|算術演算子|説明|
|:---|:---|
|*|乗算|
|/|実数除算|
|+|加算|
|-|減算|

※ 少なくとも片方の項が実数型の場合、除算に用いられる演算子は / となります。

次の[標準関数](https://qiita.com/ht_deko/items/15b27e00fac9d723d9f0#%E6%A8%99%E6%BA%96%E9%96%A2%E6%95%B0-required-functions)は実数型のパラメータを受け取って整数型の値を返します。

|関数|パラメータ|説明|
|:---|:---|:---|
|[Abs()](http://docwiki.embarcadero.com/Libraries/ja/System.Abs)|実数型の変数または実数値|値の絶対値を返す|
|[Sqr()](http://docwiki.embarcadero.com/Libraries/ja/System.Sqr)|実数型の変数または実数値|値の 2 乗を返す|

次の[標準関数](https://qiita.com/ht_deko/items/15b27e00fac9d723d9f0#%E6%A8%99%E6%BA%96%E9%96%A2%E6%95%B0-required-functions)は整数型のパラメータを受け取って実数型の値を返します。

|関数|パラメータ|説明|
|:---|:---|:---|
|[Sin()](http://docwiki.embarcadero.com/Libraries/ja/System.Sin)|実数型の変数または実数値|値の正弦を返す|
|[Cos()](http://docwiki.embarcadero.com/Libraries/ja/System.Cos)|実数型の変数または実数値|値の余弦を返す|
|[ArcTan()](http://docwiki.embarcadero.com/Libraries/ja/System.ArcTan)|実数型の変数または実数値|値の逆正接を返す|
|[Ln()](http://docwiki.embarcadero.com/Libraries/ja/System.Ln)|実数型の変数または実数値|値の自然対数を返す|
|[Exp()](http://docwiki.embarcadero.com/Libraries/ja/System.Exp)|実数型の変数または実数値|値の指数関数を返す|
|[Sqrt()](http://docwiki.embarcadero.com/Libraries/ja/System.Sqrt)|実数型の変数または実数値|値の平方根を返す|

Delphi の実数型には他に **Real48**, **Single**, **Double**, **Extended**, **Comp**, **Currency** があります。

**See also:**

 - [実数型 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E5%8D%98%E7%B4%94%E5%9E%8B%EF%BC%88Delphi%EF%BC%89#.E5.AE.9F.E6.95.B0.E5.9E.8B)
 - [System.Real (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.Real)

## (2.6.) 順序型変数の初期化

Delphi ではグローバル変数に限り、変数宣言と同時に初期化できます。

```pascal:SimpleTypeInitTest.pas
program SimpleTypeInitTest;
{$APPTYPE CONSOLE}

// グローバル単純型変数と初期化
var
  b1: Boolean = True;
  i1: Integer = 100;
  c1: Char = 'A';
  r1: Real = 3.14;

  procedure Sub;
// ローカル単純型変数は初期化できない
//var
//  b2: Boolean = True;
//  i2: Integer = 100;
//  c2: Char = 'A';
//  r2: Real = 3.14;
  begin
    ...
  end; { Sub }
begin
  ...
end.
```

**See also:**

 - [変数の宣言 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E5%A4%89%E6%95%B0%EF%BC%88Delphi%EF%BC%89#.E5.A4.89.E6.95.B0.E3.81.AE.E5.AE.A3.E8.A8.80)

# 索引
[ [← 1. 記法: トークンと区切り文字](https://qiita.com/ht_deko/items/ce1f56017fb4fcf0302a) ] [ [↑ 目次へ](https://qiita.com/ht_deko/items/e2796788c65c2cda1de5) ] [ [→ 3. プログラムヘッダと宣言部](https://qiita.com/ht_deko/items/2d5996cbfc82d734b247) ] [:sushi:](https://qiita.com/ht_deko/items/e36898d7aa4bb3300f78)

[^1]: 慣れないうちは素直に `i := i + 1;` と書いたほうがソースコードの視認性はいいと思います。