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

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


## 2.1. 順序型 (Ordinal Types)

#### ・順序関数の引数の型は？

関数 [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) は**順序関数**と呼ばれる、ちょっと特殊な関数です。パラメータはいずれも**順序式**で、任意の順序型を受け付けます。

`function func(X: Ordinal): Result;` 

上記のような形式の関数になるのですが、`Ordinal` という型が存在するわけではないので、ユーザー定義の順序関数を作る事はできません。もちろん、**オーバーロード関数**を作る事は可能です。

**See also:**

 - [手続きと関数のオーバーロード (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%A8%E9%96%A2%E6%95%B0%EF%BC%88Delphi%EF%BC%89#.E6.89.8B.E7.B6.9A.E3.81.8D.E3.81.A8.E9.96.A2.E6.95.B0.E3.81.AE.E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC.E3.83.AD.E3.83.BC.E3.83.89) 

## 2.2. Boolean 型 (Boolean Types)

## 2.3. Integer 型 (Integer Types)

#### ・剰余演算子について

他の言語を見渡してみると、`剰余の演算子` と呼ばれるものには、**REM (Remainder)** と **MOD (Modulo)** の 2 種類があります。

| 言語 | REM | MOD |
|:---|:---:|:---:|
| 標準 Pascal  | N/A | **mod**  |
| Delphi | **mod**  | N/A |
| Modula-2 (PIM) | **MOD**  | N/A |
| Modula-2 (ISO) | **REM**  | **MOD** |
| Ada | **rem**  | **mod** |
| C/C++ | **%** | N/A |

オペランドがどちらも正の数の場合には演算結果は同じになりますが、被除数が負の数の場合には演算結果が異なります。

##### A MOD B (標準 Pascal)

標準 Pascal の **MOD** の演算結果です。

| A | B | V |
|---:|---:|---:|
| 31 | 10 | 1 |
| -31 | 10 | 9 |
| 31 | -10 | エラー |
| -31 | -10 | エラー |

除数に負の数を指定するとエラーになります。

##### A REM B

Delphi / Modula-2 (PIM) の **MOD**、 Modula-2 (ISO) / Ada の **REM** の演算結果です。

| A | B | V |
|---:|---:|---:|
| 31 | 10 | 1 |
| -31 | 10 | -1 |
| 31 | -10 | 1 |
| -31 | -10 | -1  |

##### A MOD B

Modula-2 (ISO) / Ada の **MOD** の演算結果です。**GNU Pascal** や、**Free Pascal** の ISO モードもこちらです。

| A | B | V |
|---:|---:|---:|
| 31 | 10 | 1 |
| -31 | 10 | 9 |
| 31 | -10 | 例外 or -9 |
| -31 | -10 | 例外 or -1 |

**REM** と **MOD** を Delphi のコードで書くとこうなります。

```pascal
  function Rem2(A, B: Integer): Integer;
  begin
    Result := A mod B;
  end;

  function Mod2(A, B: Integer): Integer;
  begin
    Result := A - (A div B) * B;
    if Result < 0 then
      Result := Result + B;
  end;
```

**See also:**

 - [剰余演算 (Wikipedia)](https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97)


#### ・論理演算子について

**xor**, **shr**, **shl** 演算子は **Turbo Pascal 1.0** から存在しました。同様に **BLS Pascal** では **EXOR** と **SHIFT** 演算子があり、**SHIFT** 演算子は正の数で左シフト、負の数で右シフトでした。

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

**Turbo Pascal** の Integer は 16 ビットでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/2e1cb409-677c-3002-6b06-bf052be78c9c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/902e6353-7f2c-bc75-2131-7e7688b89947.png)

**See also:**

 - [Delphi のご先祖を辿る (Qiita)](https://qiita.com/ht_deko/items/b41b0cd45181aec522d4) 
 - [Pascal の勉強に使えそうな Pascal 処理系 (Qiita)](https://qiita.com/ht_deko/items/6376997a6d74e77c89e3)

## 2.4. Char 型 (Character Types)

## 2.5. Real 型 (Real Types)

Real48 は**クラシック Pascalが稼働していた CDC 6000 シリーズにネイティブ**な 48 ビットの実数型です。

Delphi も Delphi 3 まで Real 型は 48bit でした。Delphi 4 以降、Real 型は 64bit になり、後方互換性のための Real48 型が残されました。

Real 型を 48bit 実数型にするには `{$REALCOMPATIBILITY ON}` コンパイラ指令を用います。

**See also:**

 - [System.Real48 (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.Real48)
 - [Real48 の互換性 (Delphi) (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/Real48_%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7%EF%BC%88Delphi%EF%BC%89)
 - [Real48 - 内部データ形式 (Delphi) (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/%E5%86%85%E9%83%A8%E3%83%87%E3%83%BC%E3%82%BF%E5%BD%A2%E5%BC%8F%EF%BC%88Delphi%EF%BC%89#Real48_.E5.9E.8B)

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


# 索引
[:ramen:](https://qiita.com/ht_deko/items/5c04bb2b42947e29d94b) [ [← 1. 記法: トークンと区切り文字〔裏〕](https://qiita.com/ht_deko/items/bb5d4eaf532e8c217cdb) ] [ [↑ 目次へ](https://qiita.com/ht_deko/items/46fcdbb11cdc58872160) ] [ [→ 3. プログラムヘッダと宣言部〔裏〕](https://qiita.com/ht_deko/items/26e37c293ee14c43238e) ]