単純型のうち、実数型以外はすべて順序型になります。
順序型には、整数型、論理型、文字型、列挙型、部分範囲型があります。
その中で、整数型、論理型、文字型 が、すぐに使用できる定義済みの順序型になります。ここでは定義済みの順序型について説明します。
順序型の共通事項 |
---|
順序型は、順序を持つ値の有限集合を表します。整数型の順序数はその整数値自身となり、整数型以外の順序数は、基本的に 0, 1, 2, ・・・ となります。
順序数は最小値と最大値をもちます。最小値以外は先行値(1つ前の値)をもち、最大値以外は後続値(1つ後の値)をもちます。
順序型はその順序数に従って、大小関係、等値関係があり、関係演算子( =, <>, <, >, <=, >= )が利用できます。
関係演算(X, Yは同じ順序型の値) | 真となる条件 | |
---|---|---|
X = Y | X と Y の順序数が等しいときに真となる | |
X <> Y | X と Y の順序数が等しくないときに真となる | |
X < Y | X の順序数が Y の順序数より小さいときに真となる | |
X > Y | X の順序数が Y の順序数より大きいときに真となる | |
X <= Y | X の順序数が Y の順序数以下のときに真となる | |
X >= Y | X の順序数が Y の順序数以上ときに真となる |
以下の定義済み関数があります。
関数 (Xは順序型の値) | 戻り値 | |
---|---|---|
Succ(X) | X の後続値 | |
Pred(X) | X の先行値 | |
Ord(X) | X の順序数 |
関数 (Tは順序型名) | 戻り値 | |
---|---|---|
High(T) | 順序型 T の最大値 | |
Low(T) | 順序型 T の最小値 |
整数型 |
---|
整数型は、整数の部分集合を表します。
■整数型の範囲とサイズ
型 | 値の範囲 (下限 .. 上限) | サイズ | 別名 | |
---|---|---|---|---|
Byte | 0 .. 255 | 符号なし 1 バイト | UInt8 | |
ShortInt | -128 .. 127 | 符号付き 1 バイト | Int8 | |
SmallInt | -32768 .. 32767 | 符号付き 2 バイト | Int16 | |
Word | 0 .. 65535 | 符号なし 2 バイト | UInt16 | |
Integer | LongInt と同じ *1) | 符号付き 4 バイト *1) | Int32 | |
Cardinal | LongWord と同じ | 符号なし 4 バイト | UInt32 | |
LongInt | -2147483648 .. 2147483647 | 符号付き 4 バイト | Int32 | |
LongWord | 0 .. 4294967295 | 符号なし 4 バイト | UInt32 | |
Int64 | -9223372036854775808 .. 9223372036854775807 | 符号付き 8 バイト | Int64 | |
QWord | 0 .. 18446744073709551615 | 符号なし 8 バイト | UInt64 |
*1) 標準では Integer は SmallInt と同じですが、OBJFPC モードでは Integer は LongInt と同じになります。
整数の定数は値に基づいて型を決定します。次の表の値の範囲を上から確認し、その範囲に含まれているときにその型を適用します。
ただし、型を指定した定数はその限りではありません。
■整数型の型としての大きさ(小さい順)
整数値の範囲 (下限 .. 上限) | 適用する型 | サイズ | |
---|---|---|---|
-128 .. 127 | ShortInt | 符号付き 1 バイト | |
0 .. 255 | Byte | 符号なし 1 バイト | |
-32768 .. 32767 | SmallInt | 符号付き 2 バイト | |
0 .. 65535 | Word | 符号なし 2 バイト | |
-2147483648 .. 2147483647 | LongInt | 符号付き 4 バイト | |
0 .. 4294967295 | LongWord | 符号なし 4 バイト | |
-9223372036854775808 .. 9223372036854775807 | Int64 | 符号付き 8 バイト | |
0 .. 18446744073709551615 | QWord | 符号なし 8 バイト |
プラットフォーム(32bit, 64bit)ごとにネイティブな整数のサイズが決まっています。
32bitプラットフォームとしてコンパイルされたプログラムのネイティブ整数は32bit(4バイト)ににります。
64bitプラットフォームとしてコンパイルされたプログラムのネイティブ整数は64bit(8バイト)ににります。
注) Integer型はネイティブ整数型ではありません。プラットフォーム依存ではなく、Free Pascal のモード依存です。
整数の2項演算(+, - など)では、ネイティブ整数サイズより小さい整数は、すべて符号付きのネイティブ整数に昇格(変換)します。
1つでもネイティブ整数より大きい型(上記の表の上から下に向かって大きな型になる)が含まれる場合、それらを包含する型にすべて昇格します。
つまり、64bitプラットフォームでは、演算時にすべて64bit(8バイト)整数に昇格されることになります。また、それ以上への昇格はできません。
論理型 |
---|
論理型は、真・偽を表す値を持ちます。
論理型の値には定義済みの定数 True と False があります。True は真、False は偽をあらわします。
大小関係は、False < True となります。
■論理型のサイズと False, True の順序数
型 | サイズ | Ord(False) | Ord(True) | |
---|---|---|---|---|
Boolean | 1 バイト | 0 | 1 | |
Boolean8 | 1 バイト | 0 | 1 | |
Boolean16 | 2 バイト | 0 | 1 | |
Boolean32 | 4 バイト | 0 | 1 | |
Boolean64 | 8 バイト | 0 | 1 | |
ByteBool | 1 バイト | 0 | 0以外の任意の値 | |
WordBool | 2 バイト | 0 | 0以外の任意の値 | |
LongBool | 4 バイト | 0 | 0以外の任意の値 | |
QWordBool | 8 バイト | 0 | 0以外の任意の値 |
基本的な論理型は Boolean です。C言語などとインターフェイスを取るためにサイズの指定が必要な場合で、真・偽 を 1 と 0 として扱うときに Boolean8,Boolean16, Boolean32, Boolean64 を使用することができます。
C言語とのインターフェイスをさらに容易にするために、ByteBool, WordBool, LongBool, QWOrdBool を使用することができます。これらは、偽を 0 とし、真を 0 以外の任意の値とします。これらに True を代入するときは not 0 (-1)になります。Boolean に変換するときは、0 以外の値はすべて True に変換されます。
文字型 |
---|
文字列は文字コードで順序付けられます。1バイトの文字型と2バイトの文字型の2つあります。
■文字型のサイズ
型 | サイズ | 内容 | |
---|---|---|---|
AnsiChar | 1 バイト | 1つのASCII文字 | |
WideChar | 2 バイト | 1つのUTF-16のユニコード文字 | |
Char | AnsiChar と同じ *1) |
*1) 将来的には Char は WideChar または AnsiChar の別名になる可能性があります。Free Pascal 3.2.2 では AnsiChar です。
ユニコード文字も整数値の文字コードの前に # 記号を付けてユニコード文字値を表すことができます。
'花' と #$82B1 と #33457 は同じ値のユニコード文字です。
UTF-8で書いたソースコード上では、'花' は3バイトのUTF-8のコードですが、コンパイルしたプログラムの中ではUTF-16のコードに変換されます。
この変換が正しく行えるように、{$CODEPAGE UTF8} のディレクティブが必要なわけです。
その他に、UCS2Char、UCS4Char、UniCodeChar がありますが、これらは Delphi との互換性のためだけに用意されています。型としては WideChar と同じになります。