データ型

データ型（データがた、Data type）とは、コンピュータプログラミングや計算機科学において、属性を持つデータを分類し、その扱われ方をコンパイラやインタープリタに知らせるプログラム。単に型（かた、Type）とも言われる。 多くのプログラミング言語は、整数型・浮動小数点型・ブール型・文字型といった基本データ型を備えている。計算対象にされるデータは、しばしば値（value）と言われる。データ型は式内の値を制約して、関数への適用可能性や変数への代入可能性を定義する。データ型は、値の集合の概念と近似している。 データ型は、型システムで扱われる。型システムは、データの定義と解釈と用法を定義する形式体系である。プログラム内の多種多様なデータ間の計算の整合性を保ち、不適切な計算がなされないようにするのが型システムの目的である。これは型安全性と言われて、安全なデータ計算を保証する概念である。 計算機科学者デビッド・パーナスは、データ型の五つのタイプを定義している： 統語（syntactic） ただの表記であり意味論がない。ただ記号の整合性を重視する。 表現（representation） 意味論を持たせている。構成/構造/役割の整合性を重視する。数値とポインタ値の違いもそう。 表現＋動作（representation and behaviour） データ表現に関数/演算子を付けたもの。 値空間（value space） データ表現の論理積や論理和などによる空間表現。 値空間＋動作（value space and behaviour） 空間表現に関数/演算子を付けたもの。 データ型のバリエーションは個々の型システムによって定義される。例えば数値を示す型として、C言語の型システムはintおよびfloatを持ち、JavaScriptの型システムはNumberのみを持つ。それぞれの型システム（言語）が規定する型の分類が存在し、また慣例的にプログラミング言語問わずおこなわれる分類も存在する。複数の観点から型を分類することができる。 単純型/複合型 最小単位の型かその組み合わせによる型か（cf. 代数的データ型） 言語定義型/ユーザ定義型 言語によって最初から提供されている型か、ユーザーが自分で定義した型か first-class/non-first-class 関数の実引数/返値として利用できる型か否か（cf. 第一級オブジェクト） また処理系の実装の側からの観点が強い分類だが、レジスタなどのワードに値が直接収まる型と、ワードにはポインタが入り、ポインタの先に実際の値がある型、といったような分類もある。言語処理系実装の論文などで、前者についてimmediate（即値）という表現が見られるかもしれない。ポインタ自身に型などといったような情報を含ませることもある（en:Tagged pointer）。 なおJavaでは、Javaにおけるクラスのインスタンスである（あらゆる）オブジェクトについて、その型は「参照型」であり、intなどそれ以外の限られた全ての型は「プリミティブ型」である。ユーザが定義できるのは、型を定義できるというよりも、クラスを定義できると表現するのが正確ではないかと思われる。 以下に代表的なデータ型を列挙する。 文字型/文字列型 文字型 C/C++などでは数値型の一種で、文字を文字として扱う特別な単純型はない。 文字列型 特に文字列型を設けず、文字型の配列で文字列を表すプログラミング言語もある（例:C/C++）。逆に文字型を設けず、文字列型しかない言語もある（例:Visual Basic バージョン6まで）。 数値型 精度とサイズ・処理速度のトレードオフがあるため、サイズと精度が異なる複数の型を持つ言語が多い。 整数型 整数を扱う型。 符号付き整数型 負整数も扱える。一般に整数型は符号付きだが、符号付き整数型と符号なし整数型を別に持つ言語もある。 符号なし整数型 非負整数（0か正整数）のみを扱える。 小数（小数点を含む数ないし値）を表現する型 浮動小数点数 固定小数点数 十進型（実数型#十進型） 通貨型、金額型とも。金額を扱う場合などに適しているなどとされるが、もっぱら単なる十進ベースというだけの固定ないし浮動小数点表現であって、特に通貨や金額を扱うための何かがあるわけでもない場合も多い。 ブーリアン型 論理型、ブール型とも。多くの言語では真偽2値のみを扱うが、3値論理を扱う言語もある。整数型の1と0など、別の型の適当な値にtrueとfalseという別名を与える場合とそうでない場合がある。 日付型 日付や時刻を扱う型。日付を扱う型と時刻を扱う型が別々の場合もある。 バイナリ型 バイナリデータを扱う型。言語によってはバイナリ型を持たずに数値型の配列（例えばCでは1バイト整数型の配列）で表現する場合がある。固定長バイナリと可変長バイナリに分かれている言語もある。 関数型 第一級関数を持つプログラミング言語では、関数を値として扱うことができる。 ポインタ型 参照型、ハンドル型、オブジェクト型などとも。ポインタ型と呼ぶ場合はポインタ演算の存在を期待されていることが多い。内部表現はアドレスを表す整数型であることが多い。 void型 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。 ユニット型 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。void型との違いは、void型の値（オブジェクト）が存在しないのに対し、ユニット型にはユニット型の値が存在することである。 配列型、関数型、ポインタ型は、たいていの場合、それぞれ「～型の配列」、「…型を引数に取り～型を返す関数」、「～型へのポインタ」といったような型である。いくつかの良く出来ている言語には、総称型など、そういった型を一般的に扱う仕組みがある。いくつかのそうでない言語では、アドホックにそういった派生型を作ることができるものがある。 配列型 ベクトル型とも。 リスト型 配列型に似るが、インデックス（番号）ではなくポインタ（前後のつながり）で管理されている。 タプル型 ペア型とも。固定長の組からなる型。 数値型 複素数型 複素数を扱う型。実数を表現する型があれば複合型として実現できるが、言語によっては単純型として用意している。 純虚数型 純虚数のみを扱う型。実部が不要な分、記憶域や計算に必要なコストを抑えられる。 四元数型 四元数（クォータニオン）を扱う型。特に3次元コンピュータグラフィックスの処理で便利なため、言語によっては用意されていることがある。大抵のプログラミング言語ではライブラリにより複合型として実現される。 有理数型 有理数を分母と分子の組として表現する型。 多倍長整数型 任意の容量を使い、任意の桁数の整数を表す。これを浮動小数点数や有理数型の要素型に使って実数を表すことも多い。 区間型 行列型 配列型に似るが、行列演算ができる。スカラー[要曖昧さ回避]型・ベクトル[要曖昧さ回避]型・行列型を区別する言語と、スカラーやベクトルも列数や行数が1の行列として表す言語がある。 [脚注の使い方] ^ 機械語における、命令の直後に引き続いたデータという意味のimmediate（即値）と、似ているが異なるものなので注意が必要。 ^ Parnas, D. L.; Shore, John E.; Weiss, David (1976-03-01). “Abstract types defined as classes of variables”. ACM SIGPLAN Notices (New York, New York, USA: ACM Press) 11 (SI): 149–154. doi:10.1145/942574.807133. ISSN 0362-1340. https://doi.org/10.1145/942574.807133.  型システム データ構造