コンピュータサイエンスにおいて、整数は整数データ型のデータであり、数学的な整数の範囲を表すデータ型です。[1]整数データ型はサイズが異なり、負の値を含めることができる場合とできない場合があります。整数は通常、コンピュータでは2進数(ビット)のグループとして表現されます。グループのサイズは異なるため、利用可能な整数サイズのセットはコンピュータの種類によって異なります。コンピュータハードウェアは、ほとんどの場合、プロセッサレジスタまたはメモリアドレスを整数として表現する方法を提供しています。
整数型の項目の値は、それに対応する数学的な整数です。整数型は、符号なし(非負の整数のみを表現可能)または符号付き(負の整数も表現可能)のいずれかです。[2]
整数値は通常、プログラムのソースコード内で、+または-をオプションで接頭辞として付加された数字の列として指定されます。プログラミング言語によっては、16進数(基数16)や8進数(基数8)などの他の表記法が許可されているものもあります。また、桁区切り記号を使用できるプログラミング言語もあります。[3]
このデータの内部表現は、値がコンピュータのメモリに格納される方法です。数学的な整数とは異なり、コンピュータ内の典型的なデータには、可能な最小値と最大値があります
正の整数の最も一般的な表現は、2進法を用いたビットの文字列です。ビットを格納するメモリバイトの順序は異なります。エンディアンを参照してください。整数型の幅、精度、またはビット数[4]は、その表現におけるビット数です。nビットの整数型は2n個の数値をエンコードできます。例えば、符号なし型は通常、0から2n −1までの非負値を表します。整数値をビットパターンに変換する他のエンコード、例えば2進化10進数やグレイコード、あるいはASCIIなどの印刷文字コードが使用 されることもあります
2進法の計算システムでは、符号付き数値を表す4つのよく知られた方法があります。最も一般的なのは2の補数で、 nビットの符号付き整数型で-2 ( n -1)から2 ( n -1) -1までの数値を表すことができます。2の補数演算は、表現と値の間に完全な1対1の対応があり(特に、+0と-0が別々に存在しない)、加算、減算、乗算で符号付きと符号なしの型を区別する必要がないため便利です。 その他の可能性としては、オフセット2進法、符号絶対値法、1の補数法などがあります
一部のコンピュータ言語では、整数のサイズをマシンに依存しない方法で定義します。他の言語では、基盤となるプロセッサのワードサイズに応じて定義が異なります。すべての言語実装ですべての整数サイズの変数が定義されているわけではなく、定義されたサイズが特定の実装で区別されない場合もあります。あるプログラミング言語の整数は、異なる言語、異なるプロセッサ、または異なるビット数の実行コンテキストではサイズが異なる場合があります。「ワード」を参照してください
一部の古いコンピュータアーキテクチャでは、整数の10進表現が使用され、2進化10進数(BCD)またはその他の形式で格納されていました。これらの値は通常、10進数の桁あたり4ビット(ニブルと呼ばれることもあります)のデータサイズを必要とし、通常は符号用の追加ビットが必要です。多くの最新のCPUは、拡張データ型として10進整数を限定的にサポートし、そのような値と2進値間の変換命令を提供しています。アーキテクチャに応じて、10進整数は固定サイズ(例:7桁の10進数と符号が32ビットワードに収まる)の場合もあれば、可変長(最大桁サイズまで)の場合もあり、通常は1バイト(オクテット)あたり2桁を占めます。
CPUによってサポートされる整数データ型は異なります。通常、ハードウェアは符号付きと符号なしの両方の型をサポートしますが、幅は少数の固定されたセットのみをサポートします
上の表は、一般的なプロセッサのハードウェアでサポートされている整数型の幅を示しています。高水準プログラミング言語では、より多くの可能性が提供されます。ハードウェアでサポートされている最大の型の2倍のビット数を持つ「倍幅」の整数型を持つのが一般的です。多くの言語には、ビットフィールド型(指定されたビット数で、通常はハードウェアでサポートされている最大幅未満に制限される)と範囲型(指定された範囲の整数のみを表現できる)もあります
Lisp、Smalltalk、REXX、Haskell、Python、Rakuなどの言語では、任意精度整数(無限精度整数またはbignumとも呼ばれる)がサポートされています。この概念をトップレベル構造としてサポートしていない他の言語では、JavaのクラスやPerlの " "パッケージなど、小さな変数の配列を使用して非常に大きな数値を表すためのライブラリが用意されている場合があります。[7]これらは、数値を格納するために必要なだけのコンピュータのメモリを使用します。ただし、コンピュータの記憶域は限られているため、これらも数学的な整数の有限のサブセットしか表現できません。これらのスキームは非常に大きな数値をサポートします。たとえば、1キロバイトのメモリを使用して、最大2466桁の10進数を格納できます。
java.math.BigIntegerbigint
ブール型は、0と1の2つの値のみを表現できる型で、通常はそれぞれ偽と真で識別されます。この型は1ビットを使用してメモリに格納できますが、アドレス指定とアクセス速度の利便性のため、多くの場合、1バイトが割り当てられます。
4ビットの量は、ニブル(食事をするとき、一口よりも小さい)またはニブル(バイトという単語の形をもじったもの)と呼ばれます。1ニブルは16進数の1桁に対応し、2進化10進数の1桁または符号コードを保持します。
バイトという用語は、当初「メモリのアドレス指定可能な最小単位」を意味していました。過去には、5ビット、6ビット、7ビット、8ビット、9ビットのバイトがすべて使用されていました。また、個々のビットをアドレス指定できるコンピュータ(「ビットアドレス指定マシン」)や、16ビットまたは32ビットの量しかアドレス指定できないコンピュータ(「ワードアドレス指定マシン」)も存在しました。バイトという用語は、ビットアドレス指定マシンやワードアドレス指定マシンと関連しては、通常、まったく使用されませんでした。
オクテットという用語は、常に8ビットの量を指します。これは主に、異なるバイト幅を持つコンピュータが通信する必要がある コンピュータネットワークの分野で使用されます。
現代の用法では、他のすべてのサイズが使用されなくなったため、バイトはほぼ常に8ビットを意味します。そのため、バイトはオクテットと同義になりました。
「ワード」という用語は、特定のアーキテクチャのプロセッサによって同時に処理される小さなビットのグループを表すために使用されます。したがって、ワードのサイズはCPUによって異なります。6、8、12、16、18、24、32、36、39、40、48、60、64ビットなど、さまざまなワードサイズが使用されてきました。ワードはアーキテクチャに依存するため、通常、後続の互換性のあるCPUの特性ではなく、ファミリの最初のCPUによって設定されます。ロングワード、ダブルワード、クワッドワード、ハーフワードなど、ワードから派生した用語の意味も、CPUとOSによって異なります。[8]
事実上すべての新しいデスクトッププロセッサは64ビットワードに対応していますが、組み込みプロセッサでは8ビットや16ビットワードサイズが依然として一般的です。コンピュータの初期の頃は、36ビットワード長が一般的でした。
ソフトウェアが移植不可能になる重要な原因の 1 つは、すべてのコンピュータのワード サイズがプログラマが使用するコンピュータと同じであるという誤った想定です。たとえば、C 言語を使用するプログラマが、2 15 −1よりも大きな値を格納する変数をintとして誤って宣言すると、16 ビット整数のコンピュータではプログラムは失敗します。その変数は、どのコンピュータでも少なくとも 32 ビットであるlongとして宣言する必要があります。また、プログラマは、ポインタを情報の損失なしで整数に変換できると誤って想定している可能性があり、これは (一部の) 32 ビット コンピュータでは機能しますが、64 ビット ポインタと 32 ビット整数を使用する 64 ビット コンピュータでは失敗します。この問題は、C99 のstdint.hで の形式で解決されています。
intptr_t
プログラムのビット数は、プログラムが実行されるプロセッサのワードサイズ(またはビット数)を指す場合もあれば、メモリアドレスまたはポインタの幅を指す場合もあります。これらは実行モードやコンテキストによって異なる場合があります。たとえば、64ビット版のMicrosoft Windowsは既存の32ビットバイナリをサポートしており、Linuxのx32 ABI用にコンパイルされたプログラムは64ビットモードで実行されますが、32ビットのメモリアドレスを使用します。[9]
標準整数のサイズはプラットフォームによって異なります。
C言語ではintで表され、少なくとも16ビットである必要があります。WindowsおよびUnixシステムでは、32ビットと64ビットの両方のアーキテクチャで 32ビットのint型が使用されています。
短整数は、同じマシン上の標準整数と比較して、範囲は狭く、ストレージ容量が少なくなる可能性のある整数を表すことができます
Cではshortで表されます。少なくとも16ビットである必要があり、標準の整数よりも小さいことがよくありますが、これは必須ではありません。[10] [11]準拠プログラムは、-(2 15 − 1) [12]から2 15 − 1 [13]までの値を安全に格納できると想定できますが、範囲がそれより大きくないと想定することはできません。Javaでは、 shortは常に16ビット整数です。Windows APIでは、データ型SHORTはすべてのマシンで16ビットの符号付き整数として定義されています。[8]
long integerは、同じマシン上の標準整数の範囲以上 の範囲を持つ整数を表すことができます。
Cではlongで表されます。少なくとも32ビットである必要があり、標準整数より大きくても小さくても構いません。準拠プログラムは、-(2 31 − 1) [12]から2 31 − 1 [ 13]までの値を安全に格納できると想定できますが、範囲がそれより大きくないと想定することはできません。
Cプログラミング言語のC99バージョンとC++のC++11バージョンでは、標準の最小容量の2倍を持つ型がサポートされています。この型は、Cコードが以前のC++標準であるC++03に準拠することを要求するコンパイラではサポートされていません。これは、long long型がC++03に存在しなかったためです。ANSI/ISO準拠のコンパイラでは、指定された範囲、つまり符号付きの場合は-(2 63 − 1) [12]から2 63 − 1、符号なしの場合は0から2 64 − 1 [13]の最小要件を満たす必要がありますが、この範囲を拡張することは許可されています。[18] [19]これは、プラットフォーム間でコードとデータを交換する場合、または直接ハードウェアアクセスを行う場合に問題になる可能性があります。そのため、プラットフォームに依存しない正確な幅の型を提供するヘッダーセットがいくつかあります。C標準ライブラリはstdint.hを提供します。これはC99とC++11で導入されました。
long longlong
整数リテラルは、通常のアラビア数字で記述できます。これは、一連の数字で構成され、値の前にマイナス記号を付けることで否定を示します。ただし、ほとんどのプログラミング言語では、数字のグループ化にカンマやスペースを使用することはできません。整数リテラルの例を以下に示します。
4210000-233000多くのプログラミング言語には、整数リテラルを記述するためのいくつかの代替方法があります。
0Xまたはを付けます(例:)。他の言語では異なる表記法が使用される場合があります。たとえば、一部のアセンブリ言語では、16進数値の末尾にまたはを追加します0x0xDEADBEEFHh10_000_000を使用できます(例: ) 。また、固定形式のFortranでは、整数リテラル内の埋め込みスペースは無視されます。C( C23以降)とC++では、この目的で一重引用符を使用します。0755で使用することを目的としていましたが、通常の整数もゼロで始まる可能性があるため、批判されてきました。[21]そのため、Python、Ruby、Haskell、OCamlでは、16進値で使用されるレイアウトに従って、8進値の前にまたはを付けます0O0o0Bまたはを付けることで2進数値を表すことができます0b。多くのプログラミング言語では、特定の整数型で表現できる最小値と最大値を表す定義済み定数が存在します。
これらの名前には以下が含まれます。
MAXINT[22]java.lang.Integer.MAX_VALUEjava.lang.Integer.MIN_VALUE
INT_MAX、、INT_MINなど[要出典] [ 24]std::numeric_limits<int>::max()std::numeric_limits<int>::min()
G_MININT、、、… [ G_MAXINT26]G_MAXUINTminBound、 [27]maxBoundMaxInt[要出典]sys.maxintsys.maxsize[29]i32::MAX, i32::MIN, etc.[30]maxint[31]