コンピュータ サイエンスでは、整数は整数データ型のデータであり、数学的な整数の範囲を表すデータ型です。整数データ型はサイズが異なり、負の値を含めることができる場合とできない場合があります。整数は一般に、コンピュータ内で2 進数(ビット) のグループとして表されます。グループのサイズは異なるため、使用可能な整数のサイズのセットはコンピュータの種類によって異なります。コンピュータ ハードウェアは、プロセッサレジスタまたはメモリ アドレスを整数として 表す方法をほぼ常に提供します。
価値と表現
整数型の項目の値は、それに対応する数学的な整数です。整数型は符号なし(非負の整数のみを表すことができる)または符号付き(負の整数も表すことができる)のいずれかです。[1]
整数値は通常、プログラムのソースコード内で、 +または-をオプションで接頭辞として付けた数字の列として指定されます。プログラミング言語によっては、16進数(基数16)や8進数(基数8)などの他の表記法も使用できます。また、一部のプログラミング言語では、数字のグループ区切りも使用できます。[2]
このデータの内部表現は、値がコンピュータのメモリに保存される方法です。数学的な整数とは異なり、コンピュータ内の一般的なデータには、可能な最小値と最大値があります。
正の整数の最も一般的な表現は、2進数表記法を使用したビットの文字列です。ビットを格納するメモリバイトの順序はさまざまです。エンディアンを参照してください。整数型の幅、精度、またはビット数[3]は、その表現におけるビット数です。nビットの整数型は 2 n個の数値をエンコードできます。たとえば、符号なし型は通常、 0 から2 n − 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 進数の間の変換を行う命令を提供しています。アーキテクチャによっては、10 進整数のサイズが固定されている場合 (たとえば、7 桁の 10 進数と符号が 32 ビット ワードに収まる) や、可変長 (最大桁サイズまで) の場合があり、通常は 1 バイト (オクテット) あたり 2 桁を占めます。
一般的な整数データ型
異なるCPU は異なる整数データ型をサポートします。通常、ハードウェアは符号付きと符号なしの両方の型をサポートしますが、幅は少数の固定されたセットのみをサポートします。
上記の表は、一般的なプロセッサのハードウェアでサポートされている整数型の幅を示しています。高水準プログラミング言語では、より多くの可能性が提供されます。ハードウェアでサポートされている最大の型の 2 倍のビット数を持つ「倍幅」の整数型を持つことが一般的です。多くの言語には、ビット フィールド型 (指定されたビット数で、通常はハードウェアでサポートされている最大幅未満に制限されます) と範囲型 (指定された範囲内の整数のみを表すことができます) もあります。
Lisp、Smalltalk、REXX、Haskell、Python、Rakuなどの言語では、任意精度整数(無限精度整数またはbignumとも呼ばれる)がサポートされている。この概念をトップレベル構造としてサポートしていない他の言語では、JavaのBigIntegerクラスやPerlの「bigint」パッケージなど、小さな変数の配列を使用して非常に大きな数値を表すためのライブラリが用意されている場合がある。[7]これらは、数値を格納するために必要なだけのコンピュータのメモリを使用するが、コンピュータのストレージ容量には限りがあるため、これらも数学的な整数の有限のサブセットしか表現できない。これらのスキームは非常に大きな数値をサポートしており、たとえば、1キロバイトのメモリを使用して、10進数で最大2466桁の数値を格納できる。
ブール型またはフラグ型は、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 ビット ワード長が一般的でした。
ソフトウェアが移植不可能になる大きな原因の 1 つは、すべてのコンピュータのワード サイズがプログラマが使用するコンピュータと同じであるという誤った想定です。たとえば、C 言語を使用するプログラマが、 2 15 −1より大きい値を格納する変数をintとして誤って宣言すると、プログラムは 16 ビット整数のコンピュータでは失敗します。その変数は、どのコンピュータでも少なくとも 32 ビットであるlongとして宣言する必要があります。プログラマは、ポインタを情報の損失なしに整数に変換できると誤って想定することもあります。これは、(一部の) 32 ビット コンピュータでは機能しますが、64 ビット ポインタと 32 ビット整数を使用する 64 ビット コンピュータでは失敗します。この問題は、C99 のstdint.hでの形式で解決されています。
intptr_t
プログラムのビット数は、プログラムが実行されるプロセッサのワードサイズ(またはビット数)を指す場合もあれば、実行モードやコンテキストによって異なるメモリアドレスまたはポインタの幅を指す場合もあります。たとえば、Microsoft Windowsの 64 ビット バージョンは既存の 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]
長整数
長整数は、同じマシン上の標準整数の範囲以上の 整数全体を表すことができます。
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
多くのプログラミング言語では、整数リテラルを記述するための代替方法がいくつかあります。
- 多くのプログラミング言語、特にCの影響を受けた言語では、16進数値を表すために
0X整数リテラルの前に または を付けます(例)。他の言語では異なる表記法が使用される場合があります。たとえば、一部のアセンブリ言語では16 進数値の末尾にまたはが追加されます。0x0xDEADBEEFHh - Perl、Ruby、Java、Julia、D、Go、Rust、Python (バージョン 3.6 以降) では、わかりやすくするために、埋め込みアンダースコア
10_000_000を使用できます (例: )。また、固定形式のFortranでは、整数リテラル内の埋め込みスペースは無視されます。C ( C23以降) および C++ では、この目的で一重引用符を使用します。 - CおよびC++では、先頭のゼロは8進数値を示します(例: ) 。これは主にUnixモード
0755で使用することを意図していましたが、通常の整数もゼロで始まることがあるため批判されてきました。[20]そのため、Python、Ruby、Haskell、OCamlでは、16進数値で使用されるレイアウトに従って、 8進数値の前にまたは を置きます。0O0o - Java、C#、Scala、Python、Ruby、OCaml、C(C23 以降)、C++などのいくつかの言語では、数字の前に
0Bまたはを付けることでバイナリ値を表すことができます0b。
参照
注記
- ^ すべてのSQL方言が符号なしデータ型を持っているわけではない。[4] [5]
- ^ abcdefghijklmn C/C++ における char、short、int、long、long longのサイズは、言語の実装に依存します。
- ^ abcd Fortanは整数のサイズを制御するために特別なディレクティブを使用します。[6]
- ^ Java は char型の算術演算を直接サポートしていません。結果はintからcharにキャストし直す必要があります。
- ^ ab Delphi の IntegerとCardinalのサイズは保証されておらず、プラットフォームによって異なります。通常はそれぞれLongIntとLongWordとして定義されます。
- ^ ab 将来の使用のために予約されています。まだ実装されていません。
- ^ ISO C標準では、実装において、符号ビットが1で他のすべてのビットが0(符号絶対値と2の補数表現の場合)またはすべてのビットが1(1の補数の場合)の値を「トラップ」値として使用するために予約することが許可されており、これは(たとえば)オーバーフローを示すために使用されます。[12]
参考文献
- ^ Cheever, Eric. 「数値の表現」. スワースモア大学. 2011年9月11日閲覧。
- ^ Madhusudhan Konda (2011-09-02). 「Java 7 の新機能の概要 - O'Reilly Radar」. Radar.oreilly.com . 2013-10-15閲覧。
- ^ Barr, Adam (2018-10-23). ソフトウェアの問題: 賢いエンジニアが悪いコードを書く理由。MIT プレス。ISBN 978-0-262-34821-8。
- ^ 「Sybase Adaptive Server Enterprise 15.5: 正確な数値データ型」。
- ^ 「MySQL 5.6 数値データ型」。
- ^ 「FORTRAN 77 言語リファレンス」。2024年11月27日閲覧。
- ^ 「BigInteger (Java Platform SE 6)」。Oracle 。2011年9月11日閲覧。
- ^ abcde Fog, Agner (2010-02-16). 「さまざまな C++ コンパイラおよびオペレーティング システムの呼び出し規約: 第 3 章、データ表現」(PDF) 。2010年 8 月 30 日閲覧。
- ^ Thorsten Leemhuis (2011-09-13). 「Kernel Log: x32 ABI が 64 ビットの欠点を回避」 www.h-online.com. 2011 年 10 月 28 日時点のオリジナルよりアーカイブ。2011年 11 月 1 日に閲覧。
- ^ Giguere, Eric (1987-12-18). 「ANSI 標準: C プログラマ向け概要」. 2010-09-04閲覧。
- ^ ab Meyers, Randy (2000-12-01). 「新しい C: C99 の整数、パート 1」. drdobbs.com . 2010-09-04に閲覧。
- ^ abcd "ISO/IEC 9899:201x" (PDF) . open-std.org. セクション 6.2.6.2、パラグラフ 2 . 2016 年 6 月 20 日閲覧。
- ^ abc "ISO/IEC 9899:201x" (PDF) . open-std.org. section 5.2.4.2.1 . 2016年6月20日閲覧。
- ^ 「C++ の基本型」 cppreference.com 。2010年12 月 5 日閲覧。
- ^ 「第8.6.2章 12ページ」(PDF) . ecma-international.org.
- ^ VB 6.0 ヘルプファイル
- ^ 「Integer、Long、Byte データ型 (VBA)」。microsoft.com。2006年 12 月 19 日閲覧。
- ^ Giguere, Eric (1987 年 12 月 18 日). 「ANSI 標準: C プログラマ向け概要」 . 2010 年 9 月 4 日閲覧。
- ^ 「アメリカ標準プログラミング言語 C は、C プログラミング言語で書かれたプログラムの構文とセマンティクスを規定しています」。2010 年 8 月 22 日時点のオリジナルよりアーカイブ。2010 年 9 月 4 日閲覧。
- ^ ECMAScript 6th Edition ドラフト: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals 2013-12-16 にWayback Machineでアーカイブ
