整数型

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

整数型(せいすうがた)は、コンピュータプログラムなどのデータ型の1つまたは1群で、整数の、多くの場合はその部分集合を取り扱うもので、コンピュータで扱うもっとも単純な部類のデータ型のひとつである。C言語Javaなどの多くのプログラミング言語では、整数型はいわゆる固定長であり、その固定サイズで表現可能な範囲の、整数有限部分集合の要素を値とする型である。また多くの言語において、標準あるいは第三者によるライブラリにより、範囲に制限のない整数も扱うことができる。

パスカルによる機械式計算機などが数をその処理の対象としていたことを考えれば、計算機械の歴史において、整数を扱うことはコンピュータ以前からの存在である。

種類[編集]

コンピュータの数値表現の記事も参照。

精度[編集]

データ型としての整数とは無関係に(どんな種類の整数型であっても)、数値的に言えることとして、任意の実数から4捨5入で端数処理した場合の絶対精度は ±0.5 であり、相対精度はその値を x とすると ±0.5/x である。固定長の場合は表現可能な値の範囲に制限がある。精度に関しては「正確度と精度」の記事も参照。

固定長と可変長[編集]

C言語のintなど、多くのプログラミング言語における組込みの整数型は固定長であり、16ビットか32ビット(あるいは近年では64ビット、稀に8ビット)といった、レジスタワード幅などに合わせたサイズとされる。多くの場合、目的に合わせて、いくつかのサイズの固定長の整数型がある(後述)。

一方、整数の任意の値を扱うことができる、可変長の整数というものもある。一般にプロセッサが直接扱うことはできないため、C言語ではライブラリを利用する。言語仕様としてそのようなデータ型が用意されている言語もあり、一部の言語では計算結果に応じてシームレスに固定長と切り替わる(プログラマからは隠蔽されている)。大きい数を扱えることから BigNum あるいは整数であることを示す BigInt、日本語では多倍長などといった名前で呼ばれている。任意精度演算の記事も参照のこと。

符号ありと符号なし[編集]

正負両方の整数を表せる符号あり整数型と、非負(0または正)の整数だけを表せる符号なし整数型とがある。固定長では、符号あり整数型は、負数を表せるかわりに、表せる値の範囲の約半分が負の側に移動する。

符号なし整数は、ビットの並びをそのまま数値として解釈するが、符号あり整数では、負の値の表現方法にいくつか種類が存在する。また、「グレイコード」など、ビットの並びをそのまま数値として解釈するのではない整数の表現法もいくつもある。

長さ[編集]

可変長の整数型は任意の長さとなる。固定長の整数型では、伝統的なC言語ではshort intとlong intがあり、short intはintより長くなければよく、long intはintより短くなければよい、という緩い規定だった。しかし時代の変化により、現代ではビット数を明確化した型名が用意されるようになった(#型名の節を参照)。○ビット整数型、○バイト整数型といった用語もある。#データモデルも参照。

暗号などで1024ビットとか2048ビットといった程度の大きさの整数を扱うことがある。プログラムを書くだけであれば可変長整数で扱えるが、暗号では通信のスループットやレイテンシのために性能を求める場合もあり、そういう場合にはそのようなサイズを特に扱うための関数やマクロ等を作って使うこともある。

バイトのサイズやワードのサイズ(異なるバイトがあることについては「バイト (情報) 」の記事を参照)が文脈によって明確な場合に限られるが、バイト型、ワード型、ダブルワード型、などという言いかたでも明確に表現できる。なお、ワードが16ビットか32ビットか不明確な場合は、具体的なビット数は不明だが、「ダブルワード」という表現で倍だということはわかる。

「短精度整数型」「単精度整数型」「長精度整数型」「倍長精度整数型」という由来不明の用語がある。少なくともC言語のJISにはそのような語は無いし、前述のように整数型における(絶対)精度は常に ±0.5 なのだから意味不明でもある。浮動小数点表現を指す語からの類推かもしれず、また「精度」すなわち「語長」というように解釈している模様でもある。

固定小数点[編集]

固定小数点表現は、整数のあるビットとビットの間に固定された小数点があるものとして扱うことによる小数の表現法であり、一般にプログラマが整数演算を適宜組合せながら実装する。

文字型[編集]

現代的な観点からは、Unicode異体字セレクタのことなども考慮すれば、文字を整数型の一種として扱うのは無謀である。Javaは設計時には先進的な設計としてUnicode1.0を取り入れ、charをUCS-2を表現する16ビットの型としたが、その結果Unicode2.0(1996年)で導入されたサロゲートペアのために「1文字 = 2文字」という場合を発生させられることになった。

なおC言語のchar型については、何があろうと sizeof(char) が1になる型と、標準で決められている。極端な例としては、メモリのアドレス付けがバイト単位ではなく、16ビットのワード単位のアーキテクチャでも、CHAR_BIT は16になるが、sizeof(char) は1で、32ビットのintは sizeof(int) が2になる、といったように、charという名前ではあるが「文字型」ではなく、メモリのアドレッシングの最小単位という型がcharという名前である、という役割がある。

ポインタ[編集]

「ポインタはintではない」。特に近年では最も多い、intが32ビットでポインタが64ビットという環境(LP64(後述))で、ポインタとintの使い分けをキッチリとできないプログラマが書いたコードは完璧に破綻する(「汎整数拡張」が絡むので、汎整数拡張を完全に暗記できているようでなければおすすめできない)。

型名[編集]

符号 ビット数 バイト数 C/C++
(C99, C++11)
C/C++
(32ビット, LLP641)
C/C++
(LP641)
Java C# SQL92 VB(Ver6以前) COBOL(代表例)
8 1 int8_t signed char2 byte sbyte
16 2 int16_t short short short smallint, int2 Integer COMP-1(1から4桁)
32 4 int32_t int
long
int int int integer, int, int4 Long COMP-1(5から9桁)
64 8 int64_t long long long
long long
long long bigint, int8 COMP-1(10から18桁)
8 1 uint8_t unsigned char byte tinyint, int1 Byte BINARY-CHAR UNSIGNED(機種依存)
16 2 uint16_t unsigned short char ushort COMP-1(1から4桁)
32 4 uint32_t unsigned int
unsigned long
unsigned int uint COMP-1(5から9桁)
64 8 uint64_t unsigned long long unsigned long
unsigned long long
ulong COMP-1(10から18桁)

1 C99/C++11 には int64_t など固定幅整数型があり、特にAPIなどではそれらの型を積極的に使うべきである。もし、現役のサポートがあるとされているコンパイラであるにもかかわらず、それらの型が使えないのでできない、などというような場合は、そのプロジェクト自体の健全性をまず疑ったほうが良い。

2 C/C++ では単なる char 型の符号有/無については規定されておらず、処理系によって異なる。

データモデル[編集]

C言語において、ビット数を標準で定めていない型に対する、具体的なビット数の割り当て方をデータモデルという。

特にマイクロプロセッサの64ビット化において、intとlongと(long longと)ポインタの扱いが環境によって分かれたことから、それぞれを指す用語が広く使われている。多くの16/32ビット環境と Windows 64ビット環境ではintとlongが32ビットでポインタが64ビット、すなわち IL32P64(別名:LLP64)モデルが使用されている。また、Unix 系など多くの64ビット環境では I32LP64(別名:LP64)モデルが使用されている[1]

またその他の例としては、16ビット時代のパーソナルコンピュータ用などで、intが16ビットということがある。マイコン用などでintが8ビットというものもあった(ただし、これは標準が要求している値の範囲を満たさない)。GE-600シリーズなどではバイトが9ビットのためcharが9ビットで整数型は全て36ビット、またCrayのようにintまで64ビットだったILP64という例もある。

参照[編集]

[ヘルプ]
  1. ^ 64ビットになると何が変わる?――64ビットプログラミングのデータモデル (2/2)