コンピュータ科学において、整数は整数データ型のデータであり、数学的な整数の範囲を表すデータ型です。[ 1 ]整数データ型はサイズが異なり、負の値を含むことが許可されている場合と許可されていない場合があります。整数は一般的にコンピュータではバイナリ数字(ビット)のグループとして表現されます。グループのサイズは異なるため、使用できる整数のサイズのセットはコンピュータの種類によって異なります。コンピュータハードウェアは、プロセッサレジスタまたはメモリ アドレスを整数として表現する方法をほぼ常に提供します。
整数型の項目の値は、それに対応する数学的な整数です。整数型は、符号なし(非負の整数のみを表現可能)または符号付き(負の整数も表現可能)のいずれかです。[ 2 ]
整数値は通常、プログラムのソースコード内で、+ または − をオプションで接頭辞として付けた数字のシーケンスとして指定されます。一部のプログラミング言語では、 16 進数(基数 16) や8 進数(基数 8) などの他の表記法が使用できます。一部のプログラミング言語では、桁グループ区切り文字も使用できます。[ 3 ]
このデータの内部表現とは、コンピュータのメモリに値が格納される方法のことです。数学的な整数とは異なり、コンピュータにおける一般的なデータには、最小値と最大値が存在します。
正の整数の最も一般的な表現は、2 進数システムを使用したビット列です。ビットを格納するメモリバイトの順序は様々です。エンディアンを参照してください。整数型の幅、精度、またはビット数[ 4 ]は、その表現のビット数です。n ビットの整数型は2n個の数をエンコードできます。たとえば、符号なし型は通常、0 から2n − 1までの非負の値を表します。整数値をビット パターンにエンコードする他の方法も使用されることがあります。たとえば、2進化 10 進数やグレイ コード、またはASCIIなどの印刷文字コードなどです。
バイナリ計算システムで符号付き数を表現するには、よく知られた方法が 4 つあります。最も一般的なのは2 の補数表現で、 nビットの符号付き整数型で−2 ( n −1)から2 ( n −1) − 1までの数を表現できます。2 の補数表現は、表現と値の間に完全な1 対 1 の対応関係があること(特に、+0 と −0 が別々に存在しないこと)、および加算、減算、乗算で符号付き型と符号なし型を区別する必要がないことから便利です。その他の方法としては、オフセットバイナリ、符号絶対値、1 の補数などがあります。
コンピュータ言語によっては、整数のサイズをマシンに依存しない方法で定義するものもあれば、基となるプロセッサのワードサイズに応じて定義が異なるものもあります。すべての言語実装がすべての整数サイズの変数を定義しているわけではなく、特定の実装では定義されたサイズが区別できない場合もあります。あるプログラミング言語の整数は、別の言語、別のプロセッサ、または異なるビット数の実行コンテキストでは異なるサイズになる可能性があります。§ワードを参照 してください。
古いコンピュータアーキテクチャの中には、整数を10進数で表現し、2進符号化10進数(BCD)などの形式で格納するものがありました。これらの値は通常、10進数桁あたり4ビット(ニブルと呼ばれることもあります)のデータサイズを必要とし、通常は符号用にさらにビットが追加されます。多くの最新のCPUは、拡張データ型として10進整数を限定的にサポートしており、このような値を2進数に変換したり、2進数から変換したりする命令を提供しています。アーキテクチャによっては、10進整数は固定サイズ(例えば、7桁の10進数と符号が32ビットワードに収まる)の場合もあれば、可変長(最大桁数まで)の場合もあり、通常は1バイト(オクテット)あたり2桁を占めます。
CPUによってサポートされる整数型は異なります。一般的に、ハードウェアは符号付き型と符号なし型の両方をサポートしますが、幅は限られた固定値のみとなります。
上記の表は、一般的なプロセッサでハードウェア的にサポートされている整数型の幅を示しています。高水準プログラミング言語では、さらに多くの可能性が提供されます。ハードウェアでサポートされている最大の型の2倍のビット数を持つ「倍幅」の整数型が用意されているのが一般的です。多くの言語には、ビットフィールド型(指定されたビット数で、通常はハードウェアでサポートされている最大幅よりも小さく制限される)と範囲型(指定された範囲内の整数のみを表現できる)も用意されています。
Lisp、Smalltalk、REXX、Haskell、Python、Rakuなどの一部の言語は、任意精度整数(無限精度整数またはbignumとも呼ばれる)をサポートしています。この概念をトップレベルの構造としてサポートしていない他の言語では、Javaのjava.math.BigIntegerクラスやPerlの「」bigintパッケージなど、より小さな変数の配列を使用して非常に大きな数を表現するライブラリが利用できる場合があります。[ 7 ]これらは、数値を格納するために必要なだけコンピュータのメモリを使用しますが、コンピュータのストレージは有限であるため、数学的整数の有限サブセットしか表現できません。これらの方式は非常に大きな数をサポートしています。たとえば、1キロバイトのメモリを使用して、最大2466桁の10進数を格納することができます。
ブール型とは、 0と1の2つの値のみを表現できる型であり、通常はそれぞれfalseとtrueで表されます。この型はメモリ上で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ビットワード長は、コンピュータ黎明期には一般的だった。
ソフトウェアの移植性を損なう重要な原因の一つは、プログラマが使用するコンピュータと同じワードサイズをすべてのコンピュータが持つという誤った仮定です。例えば、C 言語を使用するプログラマが、2 15int −1より大きい値を格納するために使用する変数として誤って宣言した場合、16 ビット整数を使用するコンピュータではプログラムが失敗します。この変数は、どのコンピュータでも少なくとも 32 ビットを持つとして宣言されるべきでした。また、プログラマは、ポインタを情報損失なしに整数に変換できると誤って仮定することもあります。これは (一部の) 32 ビットコンピュータでは機能するかもしれませんが、64 ビットポインタと 32 ビット整数を使用する 64 ビットコンピュータでは失敗します。この問題は、C99 のstdint.hで の形式で解決されています。longintptr_t
プログラムのビット数は、プログラムが実行されるプロセッサのワードサイズ(またはビット数)を指す場合もあれば、メモリ アドレスまたはポインタの幅を指す場合もあり、実行モードやコンテキストによって異なる場合があります。たとえば、Microsoft Windows の 64 ビット版は既存の32ビット バイナリをサポートしており、Linux のx32 ABI用にコンパイルされたプログラムは64 ビット モードで実行されますが、32 ビットのメモリ アドレスを使用します。[ 9 ]
標準整数サイズはプラットフォームに依存します。
C言語では、これはで表され、少なくとも16ビットである必要があります。WindowsおよびUnixシステムでは、32ビットおよび64ビットアーキテクチャの両方でint32ビットのが使用されています。int
短い整数は、同じマシン上の標準的な整数と比較して、より少ない記憶容量で、より狭い範囲の整数を表すことができる。
Cでは、 で表されますshort。少なくとも 16 ビットである必要があり、多くの場合、標準の整数よりも小さいですが、これは必須ではありません。[ 10 ] [ 11 ]準拠プログラムは、 −(2 15 − 1) [ 12 ]から2 15 − 1 [ 13 ]の間の値を安全に格納できると想定できますが、範囲がそれより大きいと想定することはできません。Java では、は常に16 ビット整数shortです。Windows APIでは、データ型はすべてのマシンで 16 ビット符号付き整数として定義されています。[ 8 ]SHORT
長整数は、同じマシン上の標準整数の範囲以上である整数を表すことができる。
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進0x数値を表します(例:)。他の言語では異なる表記法が用いられる場合があり、例えば一部のアセンブリ言語では16進数値の末尾にまたはを付加します。0xDEADBEEFHh10_000_000を埋め込むことができます(例:)。また、固定形式のFortranでは、整数リテラル内のスペースは無視されます。C( C23以降)とC++では、この目的のためにシングルクォートを使用します。0755で使用することを意図していましたが、通常の整数も先頭にゼロが付く可能性があるため批判されています。[ 21 ]そのため、Python、Ruby、Haskell、およびOCaml では、16進数値で使用されるレイアウトに従って、 8 進数値にまたは を接頭辞として付けます。0O0o0Bまたはを付けることでバイナリ値を表現できます0b。多くのプログラミング言語には、特定の整数型で表現できる最小値と最大値を表す、あらかじめ定義された定数が存在する。
これらには以下のような名前があります
MAXINT[ 22 ]java.lang.Integer.MAX_VALUEjava.lang.Integer.MIN_VALUEINT_MAX、、INT_MINなど[ 24 ]std::numeric_limits<int>::max()std::numeric_limits<int>::min()minBound, maxBound[ 27 ]MaxIntsys.maxintsys.maxsizei32::MAXi32::MINmaxint[ 31 ]