(Translated by https://www.hiragana.jp/)
整数型 - Wikipedia

整数せいすうがた(せいすうがた、えい: integer type / integral type)は、コンピュータプログラムなどのデータがたの1つまたは1ぐんであり、整数せいすうあつかう。コンピュータであつかうもっとも単純たんじゅん部類ぶるいのデータがたのひとつである。C言語げんごJavaなどのおおくのプログラミング言語げんごでは、整数せいすうがた固定こていちょうであり、その固定こていサイズで表現ひょうげん可能かのう範囲はんいの、整数せいすう有限ゆうげん部分ぶぶん集合しゅうごう要素ようそとするかたである。またおおくの言語げんごにおいて、よりおおきな範囲はんい整数せいすう表現ひょうげん可能かのうなデータがたあつかうことができる、標準ひょうじゅんあるいは第三者だいさんしゃによるライブラリが提供ていきょうされている。

パスカルによる機械きかいしき計算けいさんなどがかずをその処理しょり対象たいしょうとしていたことをかんがえれば、計算けいさん機械きかい歴史れきしにおいて、整数せいすうあつかうことはコンピュータ以前いぜんからの存在そんざいである。

種類しゅるい

編集へんしゅう

コンピュータじょう実数じっすう表現ひょうげんするためによく利用りようされるのは浮動ふどう小数点しょうすうてんすうだが、有限ゆうげんのビットはば表現ひょうげんされる浮動ふどう小数点しょうすうてんすうは、数学すうがく現実げんじつ世界せかいにおける実数じっすう正確せいかく表現ひょうげんできない。そのため、コンピュータであつか実数じっすう誤差ごさふくんだ近似きんじとなる。一方いっぽう整数せいすうかんしては誤差ごさはない。ただし、有限ゆうげんのビットはばでは、表現ひょうげん可能かのう整数せいすう範囲はんい限定げんていされる。表現ひょうげん可能かのう範囲はんいえてしまうと算術さんじゅつオーバーフローこす。

精度せいどかんしては「せい確度かくど精度せいど」の記事きじ参照さんしょう

固定こていちょう可変長かへんちょう

編集へんしゅう

おおくのプログラミング言語げんごにおけるみの整数せいすうがた固定こていちょうであり、通例つうれい、8ビット・16ビット・32ビット・64ビットといった、8の倍数ばいすうオクテット)のビットはばつ。また、C言語げんご整数せいすうがた処理しょりけい依存いぞんとなっており、とくintかたlongかたプロセッサレジスタワードはばなどにわせたサイズがよくもちいられる。これらのがた通例つうれいプロセッサの機械きかい命令めいれい直接ちょくせつ対応たいおうするデータがたであり、コンピュータじょう高速こうそくあつかうことができる。おおくの場合ばあい目的もくてきわせて、いくつかの固定こていちょうサイズの整数せいすうがたがある(後述こうじゅつ)。

一方いっぽう整数せいすう任意にんいあつかうことができる、可変長かへんちょう整数せいすうというものもある。一般いっぱんプロセッサ直接ちょくせつあつかうことはできないため、おおくのプログラミング言語げんごではライブラリを利用りようする。言語げんご仕様しようとしてそのようなデータがた用意よういされている言語げんごもあり、一部いちぶ言語げんご[よう説明せつめい]では計算けいさん結果けっかおうじてシームレスに固定こていちょうわる(プログラマからは隠蔽いんぺいされている)。おおきいかずあつかえることから BigNum あるいは整数せいすうであることをしめす BigInt、日本語にほんごでは多倍たばいちょうなどといった名前なまえばれている。任意にんい精度せいど演算えんざん記事きじ参照さんしょうのこと。

符号ふごうきと符号ふごう

編集へんしゅう

正負せいふ両方りょうほう整数せいすうあらわせる符号ふごう整数せいすうがた[ちゅう 1]と、非負ひふ(0またはせい)の整数せいすうだけをあらわせる符号ふごう整数せいすうがた[ちゅう 2]とがある。固定こていちょうでは、符号ふごう整数せいすうがたは、負数ふすうあらわせるかわりに、あらわせる範囲はんいやく半分はんぶんまけがわ移動いどうする。

符号ふごう整数せいすうは、ビットのならびをそのまま数値すうちとして解釈かいしゃくするが、符号ふごう整数せいすうでは、まけ表現ひょうげん方法ほうほうにいくつか種類しゅるい存在そんざいする。また、「グレイコード」など、ビットのならびをそのまま数値すうちとして解釈かいしゃくするのではない整数せいすう表現ひょうげんほうもいくつもある。

可変長かへんちょう整数せいすうがた任意にんいながさとなる。固定こていちょう整数せいすうがたは、通例つうれい処理しょりけい都合つごうによって定義ていぎされる。従来じゅうらいからあるC言語げんごおよびC++整数せいすうがたにはintのほかにshort (short int) とlong (long int) があるが、<limits.h>にて表現ひょうげん可能かのう上下じょうげげん規定きていされているだけで、shortながさはintなが以下いかであればよく、longながさはintなが以上いじょうであればよい、というゆる規定きていしかない(符号ふごうがた同様どうよう)。また内部ないぶ表現ひょうげん規定きていされていなかった(だい多数たすう処理しょりけいでは2の補数ほすう表現ひょうげん採用さいようされているが、C17/C18以前いぜんおよびC++17以前いぜん規格きかくでは規定きていされていない[1])。しかし時代じだい変化へんかにより、のちのC/C++標準ひょうじゅん規格きかくではビットすう内部ないぶ表現ひょうげん明確めいかくしたかた別途べっと用意よういされるようになった。C99/C++11 では int64_t などの固定こていはば整数せいすうがた標準ひょうじゅんされている。このようなかたとくAPIなど、移植いしょくせい相互そうご運用うんようせい重視じゅうしされるケースで有用ゆうようであるが、規格きかくではオプションあつかいであり、実際じっさい固定こていはば整数せいすうがた定義ていぎ(サポート)するかどうかは処理しょりけいゆだねられているため、かならずしも利用りようできるとはかぎらない[2]。nビット整数せいすうがた、nバイト整数せいすうがたといった用語ようごもある。#データモデル参照さんしょう。なお、JavaC#といった後発こうはつ言語げんごでは、最初さいしょからかく整数せいすうがたのビットはば内部ないぶ表現ひょうげん標準ひょうじゅん仕様しようによって規定きていしている。C++20では、符号ふごう整数せいすうがたが2の補数ほすう表現ひょうげんであることが規定きていされた[3]同様どうようにC23では、符号ふごう整数せいすうがたが2の補数ほすう表現ひょうげんであることが規定きていされる予定よていである[4]

暗号あんごうなどで1024ビットや2048ビットといった程度ていどおおきさの整数せいすうあつかうことがある。プログラムをくだけであれば汎用はんようてき可変長かへんちょう整数せいすうあつかえるが、暗号あんごうでは通信つうしんのスループットやレイテンシ向上こうじょうのために性能せいのうもとめる場合ばあいもあり、そういう場合ばあいにはそのような固定こていサイズのデータがたを、がた集合しゅうごうすなわち配列はいれつ構造こうぞうたいのような集成しゅうせいたいによって表現ひょうげんし、その処理しょりとくした関数かんすうやマクロとう定義ていぎして使つかうこともある。

バイト (byte) のサイズやワード (word) のサイズ(ことなるバイトがあることについては「バイト (情報じょうほう) 」の記事きじ参照さんしょう)が文脈ぶんみゃくによって明確めいかく場合ばあいかぎられるが、バイトがた・ワードがた・ダブルワードがた、などといういかたでも明確めいかく表現ひょうげんできる。なお、ワードのサイズが明確めいかく場合ばあいでも、(具体ぐたいてきなビットすう不明ふめいだが)すくなくとも「ダブルワード」はワードのばいだということはわかる。

固定こてい小数点しょうすうてん

編集へんしゅう

固定こてい小数点しょうすうてん表現ひょうげんは、整数せいすうのあるビットとビットのあいだ固定こていされた小数点しょうすうてんがあるものとしてあつかうことによる小数しょうすう表現ひょうげんほうであり、一般いっぱんにプログラマが整数せいすう演算えんざん適宜てきぎわせながら実装じっそうする。

文字もじがた

編集へんしゅう

ASCII文字もじコード体系たいけいでは、7ビットですべての文字もじ表現ひょうげん可能かのうなことから、1文字もじを1バイトの整数せいすうがたとしてあつかうことが可能かのうである。英語えいごけんのみにかぎれば、ASCIIで十分じゅうぶんであった。しかし、日本語にほんご中国ちゅうごく韓国かんこくなど、文字種もじしゅべつおお言語げんごでは、1文字もじを1バイトで表現ひょうげんすることは不可能ふかのうであり、1文字もじ複数ふくすうバイトであらわ符号ふごう方式ほうしきマルチバイトエンコーディング)が言語げんごごとに考案こうあんされた。さらに国際こくさい対応たいおう観点かんてんから、言語げんごべつ符号ふごう方式ほうしきではなく、統一とういつされたユニバーサルな符号ふごう方式ほうしきとしてUnicode考案こうあんされた。Java当初とうしょ先進せんしんてき設計せっけいとしてUnicode 1.0をれ、charかたUCS-2表現ひょうげんする16ビットのかたとしたが、のちにUnicode 2.0(1996ねん)で導入どうにゅうされたサロゲートペアのために、1文字もじchar2ついやす場合ばあい発生はっせいすることになった。国際こくさい対応たいおう観点かんてんからは、Unicode異体いたいセレクタのことなども考慮こうりょすれば、"文字もじ"という概念がいねん単純たんじゅん整数せいすうがた一種いっしゅとしてあつかうのは無謀むぼうである。

なおC言語げんごcharかたについては、なにがあろうと sizeof(char) が1になるかたと、標準ひょうじゅんめられている。極端きょくたんれいとしては、メモリのアドレスけがバイト単位たんいではなく、16ビットのワード単位たんいのアーキテクチャでも、CHAR_BIT は16になるが、sizeof(char) は1で、32ビットのintsizeof(int) が2になる。このように、charという名前なまえではあるが「文字もじがた」ではなく、メモリのアドレッシングの最小さいしょう単位たんいしめかたcharである、という役割やくわりがある。なお、C/C++のワイド文字もじかたwchar_tながさがchar以上いじょうであることがもとめられているだけであり、エンコーディングにかんしても規定きていはない。

ブーリアンがた

編集へんしゅう

論理ろんり演算えんざん使つかわれるブーリアンがたは、C/C++では整数せいすうがた一種いっしゅとして規定きていされている。C99で追加ついかされた_Boolかたは、サイズは規定きていされていないが、標準ひょうじゅん符号ふごう整数せいすうがた (standard unsigned integer type) のひとつである[5]。C++のboolかたは、サイズは規定きていされておらず、またとしてtrueまたはfalseのいずれかをとることが標準ひょうじゅん規格きかく保証ほしょうされているが、各種かくしゅ文字もじがた符号ふごうき・符号ふごう整数せいすうがたあわせて、integral type (integer type) と総称そうしょうされている[6]

Cでは論理ろんり演算えんざんしき結果けっかintかた1しん)または0にせ)となり、もともとブーリアンがた用意よういされていなかった。そのため、サードパーティせいのライブラリやAPIではコードの意図いと明確めいかくするなどの目的もくてきで、typedef使つかってなんらかの整数せいすうがた別名べつめい(エイリアス)をあたえ、独自どくじのブーリアンがたBOOLBOOLEANなど)として定義ていぎすることがよくあった[7]

ただしJavaやC#などの後発こうはつ言語げんごでは、(内部ないぶてき表現ひょうげんはともかくとして)言語げんご仕様しようじょう整数せいすうがたとは独立どくりつしたべつかたとして定義ていぎされていることもおおく、整数せいすうがたとの暗黙あんもくてき相互そうご変換へんかん代入だいにゅう)が許可きょかされない。

列挙れっきょがた

編集へんしゅう

有限ゆうげん集合しゅうごう管理かんりする列挙れっきょがたは、Cでは整数せいすうがた一種いっしゅである[5]。C++では列挙れっきょがた整数せいすうがたではなく、そのため従来じゅうらいのスコープ列挙れっきょがたであってもC++11以降いこうのスコープ列挙れっきょがたであっても、列挙れっきょがた変数へんすう整数せいすう暗黙あんもくてき代入だいにゅうすることはできないようになっているが、ひろし整数せいすう昇格しょうかくによって、整数せいすうがた変数へんすう従来じゅうらい列挙れっきょ暗黙あんもくてき代入だいにゅうすることはできる[6]

Javaの列挙れっきょがた参照さんしょうがた(クラスがた)の一種いっしゅであり、整数せいすうがたではないが、Enum.ordinal()によって列挙れっきょ定数ていすうじょすう取得しゅとくすることはできる。C#の列挙れっきょがたがた一種いっしゅであり、明示めいじてきなキャストによって整数せいすうがたとの相互そうご変換へんかん可能かのうである[8]

ポインタはメモリアドレスを抽象ちゅうしょうした概念がいねんだが、ポインタがた整数せいすうがた同一どういつではない。C言語げんごにおいて、ポインタから整数せいすうおよび整数せいすうからポインタへの変換へんかん処理しょりけい定義ていぎである[9]。C/C++では、2つのポインタあいだ減算げんざん結果けっか格納かくのうする符号ふごう整数せいすうがたとして、ptrdiff_t定義ていぎされている。C99およびC++11規格きかくではvoidへのポインタと相互そうご変換へんかん可能かのう整数せいすうがたとして、intptr_tおよびuintptr_t定義ていぎされている。

各種かくしゅコンピュータ言語げんごにおける標準ひょうじゅん整数せいすうがた

編集へんしゅう

いくつかのコンピュータ言語げんごにおける標準ひょうじゅん整数せいすうがた対応たいおうひょう以下いかしめす。

整数せいすうがた型名かためい一覧いちらん
ビットすう 符号ふごう 最小さいしょう 最大さいだい C/C++
(C99, C++11)
C/C++
(ILP32, LLP64)
C/C++
(LP64)
Java C# SQL Go Rust
8 あり -(27) 27 - 1 int8_t signed char[注釈ちゅうしゃく 1] byte sbyte tinyint int8 i8
なし 0 28 - 1 uint8_t unsigned char[注釈ちゅうしゃく 1] N/A byte unsigned tinyint uint8 u8
16 あり -(215) 215 - 1 int16_t short short short smallint int16 i16
なし 0 216 - 1 uint16_t unsigned short char ushort unsigned smallint uint16 u16
32 あり -(231) 231 - 1 int32_t int
long
int int int int int32
int[注釈ちゅうしゃく 2]
i32
isize[注釈ちゅうしゃく 2]
なし 0 232 - 1 uint32_t unsigned int
unsigned long
unsigned int N/A uint unsigned int uint32
uint[注釈ちゅうしゃく 2]
u32
usize[注釈ちゅうしゃく 2]
64 あり -(263) 263 - 1 int64_t long long long
long long
long long bigint int64
int[注釈ちゅうしゃく 2]
i64
isize[注釈ちゅうしゃく 2]
なし 0 264 - 1 uint64_t unsigned long long unsigned long
unsigned long long
N/A ulong unsigned bigint uint64
uint[注釈ちゅうしゃく 2]
u64
usize[注釈ちゅうしゃく 2]
128 あり -(2127) 2127 - 1 N/A N/A N/A N/A N/A N/A N/A i128
なし 0 2128 - 1 N/A N/A N/A N/A N/A N/A N/A u128
n あり -(2n - 1) 2n - 1 - 1 N/A N/A N/A N/A N/A N/A N/A N/A
なし 0 2n - 1 N/A N/A N/A N/A N/A N/A N/A N/A
  1. ^ a b C/C++ ではたんなる char がた符号ふごうゆう/については規定きていされておらず、処理しょりけいによってことなる。
  2. ^ a b c d e f g h システムのアーキテクチャのビットはば依存いぞんする。

データモデル

編集へんしゅう

C言語げんごにおいて、ビットすう標準ひょうじゅんさだめていないかたたいする、具体ぐたいてきなビットすうかたをデータモデルという。

とくマイクロプロセッサの64ビットにおいて、intlongとポインタのあつかいが環境かんきょうによってかれ、さらに64ビット以上いじょう整数せいすう表現ひょうげん可能かのうlong longかた導入どうにゅうする処理しょりけいえたことから、それぞれの環境かんきょうごとのデータモデルを用語ようごひろ使つかわれている。おおくの32ビット環境かんきょうではintlongとポインタはいずれも32ビットのILP32モデルだったが、Microsoft Windows 64ビット環境かんきょうではintlongが32ビットでポインタが64ビット、すなわちIL32P64モデルが使用しようされている。なおlong longとポインタが64ビットであることから、LLP64モデルともばれる。一方いっぽうUnixけいなどのほかの64ビット環境かんきょうではI32LP64別名べつめいLP64)モデルが使用しようされている[10]。また、Crayのようにintも64ビットであるようなILP64モデルもある。

またそのれいとしては、16ビット時代じだいのパーソナルコンピュータようなどで、intが16ビットということがある。マイコンようなどでintが8ビットというものもあった(ただし、これはC言語げんご標準ひょうじゅん要求ようきゅうしている範囲はんいたさない)。GE-600シリーズなどでは1バイトが9ビットのためcharが9ビットで、整数せいすうがたすべて36ビットだった(これはC言語げんご規格きかく違反いはんではない)。

脚注きゃくちゅう

編集へんしゅう

注釈ちゅうしゃく

編集へんしゅう
  1. ^ 符号ふごうあり整数せいすうがた」と表記ひょうきされることもあるが、ここでは「JIS X 3010:2003 プログラム言語げんごC」における表記ひょうきしたがった。
  2. ^ 「JIS X 3014:2003 プログラム言語げんごC++」や「JIS X 3015:2008 プログラム言語げんごC#」では「符号ふごうなし整数せいすうがた」と表記ひょうきされているが、ここでは「JIS X 3010:2003 プログラム言語げんごC」における表記ひょうきしたがった。

出典しゅってん

編集へんしゅう

関連かんれん項目こうもく

編集へんしゅう