整数(コンピュータサイエンス)

コンピュータサイエンスにおいて、整数とは整数データ型データであり、数学的な整数範囲を表すデータ型です。[ 1 ]整数データ型はサイズが異なり、負の値を含む場合と含まない場合があります。整数は通常、コンピュータ内で2進数(ビット)の集合として表現されます。集合のサイズはコンピュータの種類によって異なるため、利用可能な整数サイズも異なります。コンピュータハードウェアは、プロセッサレジスタやメモリアドレスを整数として 表現する方法をほぼ常に提供しています。

価値と表現

整数型の項目の値、対応する数学的な整数です。整数型は符号なし(非負の整数のみを表現可能)または符号付き(負の整数も表現可能)のいずれかです。[ 2 ]

整数値は通常、プログラムのソースコード内で、+または-を先頭に付けた数字の列として指定されます。プログラミング言語によっては、16進数(基数16)や8進数(基数8)などの他の表記法も使用できます。また、桁区切り記号を使用できるプログラミング言語もあります。[ 3 ]

このデータの内部表現は、値がコンピュータのメモリに格納される方法です。数学的な整数とは異なり、コンピュータ内の典型的なデータには、取り得る最小値と最大値が存在します。

正の整数の最も一般的な表現は、2進数表記法を使用したビットの文字列です。ビットを格納するメモリバイトの順序は変化します。エンディアンを参照してください。整数型の精度、またはビット数[ 4 ]は、その表現におけるビット数です。nビットの整数型は 2 n個の数値をエンコードできます。たとえば、符号なし型は通常、 0 から2 n − 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進数の1桁あたり4ビット(ニブルと呼ばれることもあります)のデータサイズを必要とし、通常は符号用の追加ビットも必要です。多くの現代のCPUは、10進整数を拡張データ型として限定的にサポートしており、10進整数と2進数の間の変換命令を提供しています。アーキテクチャによっては、10進整数は固定サイズ(例えば、7桁の10進数と符号が32ビットワードに収まる)の場合もあれば、可変長(最大桁数まで)の場合もあります。可変長の場合は、通常は1バイト(オクテット)あたり2桁を占有します。

一般的な整数データ型

ビット 名前 範囲(符号付きの場合は2の補数を想定) 小数点 用途 実装
C / C++C#パスカルデルファイジャワSQL [ a ]フォートランDさび
4 ニブル、セミオクテット 符号付き: −8から7、−(2 3 )から2 3 − 10.9 2進化10進数、10進数の1桁表現
符号なし: 0から15まで、つまり2 4 − 11.2
8 バイトオクテット、i8、u8 符号付き: −128から127、−(2 7 )から2 7 − 12.11 ASCII文字、UTF-8文字エンコードコード単位int8_t ,符号付き char [ b ]sbyteSystem.SByteショートイントバイトjava.lang.Byteタイニーイント整数[ c ]バイトi8
符号なし: 0から255まで、つまり2 8 − 12.41 uint8_t ,符号なしchar [ b ]バイトSystem.Byteバイト該当なし符号なしtinyint該当なしユーバイトu8
16 ハーフワード、ワード、ショート、i16、u16 符号付き: −32,768から32,767、−(2 15 )から2 15 − 14.52 UCS-2文字、UTF-16文字エンコーディングコード単位int16_t , short , [ b ] int [ b ]ショートSystem.Int16スモールイントshortjava.lang.Shortスモールイント整数[ c ]短いi16
符号なし: 0から65,535まで、つまり2 16 − 14.82 uint16_t, 符号なし, [ b ]符号なしint [ b ]ushortSystem.UInt16言葉char [ d ]java.lang.Character符号なし小整数該当なしショート16歳未満
32 ワード、ロング、ダブルワード、ロングワード、int、i32、u32 符号付き: −2,147,483,648から2,147,483,647、 −(2 31 )から2 31 − 1まで9.33 UTF-32文字、アルファ付きトゥルーカラーFourCC 、 32 ビットコンピューティングにおけるポインタint32_t , int , [ b ] long [ b ]intSystem.Int32LongInt ;整数[ e ]intjava.lang.Integer整数整数[ c ]整数i32
符号なし: 0から4,294,967,295まで、つまり2 32 − 19.63 uint32_t, 符号なし, [ b ]符号なしint , [ b ]符号なしlong [ b ]uintSystem.UInt32ロングワード; DWord ;カーディナル[ e ]該当なし符号なし整数該当なしユニットu32
64 ワード、ダブルワード、ロングワード、ロング、ロングロング、クアッド、クワッドワード、Qword、int64、i64、u64 符号付き: −(2 63 )から2 63 − 1まで18.96 時間(例:Unixエポックからのミリ秒)、 64ビットコンピューティングにおけるポインタint64_t , long , [ b ] long long [ b ]longSystem.Int64整数64longjava.lang.Longビッグイント整数[ c ]長さi64
符号なし: 0から2 64 − 119.27 uint64_t ,符号なし long long [ b ]ulongSystem.UInt64UInt64 ; QWord該当なし符号なしビッグインテンシブ該当なしウロンu64
128 オクタワード、ダブルクワッドワード、i128、u128 符号付き: −(2 127 )から2 127 − 1まで38.23 複雑な科学的計算、

IPv6アドレス、 GUID

非標準またはコンパイラ固有の拡張機能としてのみ利用可能 セント[ f ]i128
符号なし: 0から2 128 − 138.53 ucent [ f ]u128
nnビット整数(一般的な場合) 符号付き: −(2 n −1 ) から ( 2 n −1 − 1 ) ( n − 1 ) log 10  2 C23: _BitInt(n)符号付き _BitInt(n)エイダrange-2**(n-1)..2**(n-1)-1
符号なし: 0 ~ ( 2 n − 1 ) n log 10  2 C23:符号なし_BitInt(n)Ada: 、; Python、C++ などの多くの言語の標準ライブラリまたはサードパーティの任意演算ライブラリの BigDecimal クラスまたは Decimal クラス。 range0..2**n-1mod2**n

CPUによってサポートされる整数データ型は異なります。通常、ハードウェアは符号付きと符号なしの両方の型をサポートしますが、幅は限られた固定されたセットのみをサポートします。

上記の表は、一般的なプロセッサのハードウェアでサポートされている整数型の幅を示しています。高水準プログラミング言語では、より多くの可能性が提供されます。ハードウェアでサポートされている最大の型の2倍のビット数を持つ「倍幅」整数型が一般的です。多くの言語には、ビットフィールド型(指定されたビット数で、通常はハードウェアでサポートされている最大幅未満に制限されます)や範囲型(指定された範囲の整数のみを表現できます)もあります。

LispSmalltalkREXXHaskellPythonRakuなどの言語では、任意精度整数(無限精度整数またはbignumとも呼ばれる)がサポートされています。 この概念をトップレベル構造としてサポートしていない他の言語では、 Java のクラスやPerlの " "パッケージなど、小さな変数の配列を使用して非常に大きな数値を表すためのライブラリが用意されている場合があります。[ 7 ]これらは、数値を格納するために必要なだけのコンピュータのメモリを使用します。ただし、コンピュータの記憶域は限られているため、これらも数学的な整数の有限のサブセットしか表現できません。 これらのスキームは非常に大きな数値をサポートします。たとえば、1 キロバイトのメモリを使用して、最大 2466 桁の 10 進数を格納できます。 java.math.BigIntegerbigint

ブールは、0と1の2つの値のみを表す型で、通常はそれぞれfalsetrueで識別されます。この型はメモリに1ビットで格納できますが、アドレス指定の利便性とアクセス速度のために、1バイトで格納されることがよくあります。

4ビットの量は、ニブル(食事をする時、一口よりも小さいという意味)またはニブル(バイト(byte )をもじったもの)と呼ばれます。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 ]

一般的な短整数サイズ
プログラミング言語データ型名 署名サイズ(バイト単位)最小値 最大値
CC++短い署名 2 −32,767 [グラム]+32,767
符号なしショート署名なし 2 0 65,535
C#短い署名 2 −32,768 +32,767
ショート署名なし 2 0 65,535
ジャワ短い署名 2 −32,768 +32,767
SQLスモールイント署名 2 −32,768 +32,767

長整数

整数は、同じマシン上の標準整数の範囲以上 の整数を表すことができます。

C言語ではlongで表されます。32ビット以上である必要があり、標準的な整数よりも大きくても小さくても構いません。準拠したプログラムは、-(2 ^31-1 ) [ 12 ]から2 ^31-1 [ 13 ]の範囲値を安全に格納できると想定できますが、範囲がそれ以上大きくないと想定することはできません。

一般的な長整数のサイズ
プログラミング言語承認タイプ プラットフォームデータ型名 バイト単位のストレージ符号付き範囲 符号なし範囲
C ISO/ANSI C99 国際規格 Unix , 16/32ビットシステム[ 8 ] Windows , 16/32/64ビットシステム[ 8 ]長さ4 (最低要件4) −2,147,483,647 から +2,147,483,6470~4,294,967,295(最小要件)
C ISO/ANSI C99 国際規格 Unix、64ビットシステム[ 8 ] [ 11 ]長さ8 (最低要件4) −9,223,372,036,854,775,807 から +9,223,372,036,854,775,8070~18,446,744,073,709,551,615
C++ ISO/ANSI 国際規格 UnixWindows、16/32ビットシステム 長さ4 [ 14 ](最低要件4) −2,147,483,648 から +2,147,483,6470~4,294,967,295(最小要件)
C++/CLI国際規格ECMA-372UnixWindows、16/32ビットシステム 長さ4 [ 15 ](最低要件4) −2,147,483,648 から +2,147,483,6470~4,294,967,295(最小要件)
VB会社標準 ウィンドウズ長さ4 [ 16 ]−2,147,483,648 から +2,147,483,647該当なし
VBA会社標準 WindowsMac OS X長さ4 [ 17 ]−2,147,483,648 から +2,147,483,647該当なし
SQL サーバー会社標準 ウィンドウズビッグイント8 −9,223,372,036,854,775,808 から +9,223,372,036,854,775,8070~18,446,744,073,709,551,615
C# / VB.NETECMA国際規格 マイクロソフト .NETlongまたはInt648 −9,223,372,036,854,775,808 から +9,223,372,036,854,775,8070~18,446,744,073,709,551,615
ジャワ国際/社内標準 Javaプラットフォーム長さ8 −9,223,372,036,854,775,808 から +9,223,372,036,854,775,807該当なし
パスカル? WindowsUNIXint648 −9,223,372,036,854,775,808 から +9,223,372,036,854,775,8070~18,446,744,073,709,551,615(Qword型)

長い長い

C プログラミング言語C99バージョンおよびC++のC++11バージョンでは、標準の最小容量の 2 倍を持つ型がサポートされています。long long型は C++03 に存在しなかったため、この型は C コードが以前の C++ 標準である 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

構文

整数リテラルは、通常のアラビア数字で記述できます。アラビア数字は、数値の列で構成され、値の前にマイナス記号を付けることで否定を表します。ただし、ほとんどのプログラミング言語では、数字の区切りにコンマやスペースを使用することは許可されていません。整数リテラルの例を以下に示します。

  • 42
  • 10000
  • -233000

多くのプログラミング言語では、整数リテラルを記述するための代替方法がいくつかあります。

極値

多くのプログラミング言語には、特定の整数型で表現できる最小値と最大値を表す定義済み定数が存在します。

これらの名前には以下が含まれます

参照

注記

  1. ^すべてのSQL方言が符号なしデータ型を持っているわけではない。 [ 5 ] [ 6 ]
  2. ^ a b c d e f g h i j k l m n C/C++ におけるcharshortintlonglong long のサイズは、言語の実装によって異なります。
  3. ^ a b c d Fortanは整数のサイズを制御するために「種類」を使用します。利用可能な種類を定義するパラメータ化された定数は、iso_fortran_env組み込みモジュールで使用できます。C互換の種類を定義する定数は、iso_c_binding組み込みモジュールで使用できます。
  4. ^ Javaはchar型の算術演算を直接サポートしていません。結果はint型からchar型にキャストする必要があります。
  5. ^ a b Delphi のIntegerCardinalのサイズは保証されておらず、プラットフォームによって異なります。通常はそれぞれLongIntLongWordとして定義されます。
  6. ^ a b将来の使用のために予約されています。まだ実装されていません。
  7. ^ ISO C規格では、実装において、符号ビットを1、その他のビットを0(符号絶対値と2の補数表現の場合)に設定した値、または全ビットを1(1の補数の場合)に設定した値を「トラップ」値として予約することを許可している。これは、例えばオーバーフローを示すために使用される。 [ 12 ]

参考文献

  1. ^「整数」。コンピュータサイエンス辞典。オックスフォード大学出版局。2016年1月21日。ISBN 978-0-19-968897-5
  2. ^ Cheever, Eric. 「数の表現」スワースモア大学2011年9月11日閲覧
  3. ^ Madhusudhan Konda (2011年9月2日). 「Java 7の新機能の概要 - O'Reilly Radar」 . Radar.oreilly.com . 2013年10月15日閲覧
  4. ^ Barr, Adam (2018-10-23). 『ソフトウェアの問題:なぜ賢いエンジニアは悪いコードを書くのか』MIT Press. ISBN 978-0-262-34821-8
  5. ^ 「Sybase Adaptive Server Enterprise 15.5: 正確な数値データ型」
  6. ^ 「MySQL 5.6 数値データ型」
  7. ^ "BigInteger (Java Platform SE 6)" . Oracle . 2011年9月11日閲覧
  8. ^ a b c d e Fog, Agner (2010-02-16). 「異なるC++コンパイラおよびオペレーティングシステムの呼び出し規約:第3章 データ表現」(PDF) . 2010年8月30日閲覧。
  9. ^ Thorsten Leemhuis (2011年9月13日). 「Kernel Log: x32 ABIは64ビットの欠点を回避」 . www.h-online.com. 2011年10月28日時点のオリジナルよりアーカイブ。 2011年11月1日閲覧
  10. ^ Giguere, Eric (1987-12-18). 「ANSI規格:Cプログラマのための概要」. 2010年9月4日閲覧。
  11. ^ a b Meyers, Randy (2000-12-01). 「新しいC:C99の整数、パート1」 . drdobbs.com . 2010年9月4日閲覧。
  12. ^ a b c d「ISO/IEC 9899:201x」(PDF) . open-std.org. セクション6.2.6.2、パラグラフ2. 2016年6月20日閲覧
  13. ^ a b c「ISO/IEC 9899:201x」(PDF) . open-std.org. セクション5.2.4.2.1 . 2016年6月20日閲覧
  14. ^ 「C++の基本型」 . cppreference.com. 2011年6月13日時点のオリジナルよりアーカイブ。 2010年12月5日閲覧
  15. ^ 「第8.6.2章 12ページ」(PDF) . ecma-international.org.
  16. ^ VB 6.0 ヘルプファイル
  17. ^ 「Integer、Long、Byteデータ型(VBA)」 . microsoft.com . 2006年12月19日閲覧
  18. ^ Giguere, Eric (1987年12月18日). 「ANSI規格:Cプログラマのための概要」 . 2010年9月4日閲覧
  19. ^ 「アメリカ標準プログラミング言語Cは、Cプログラミング言語で書かれたプログラムの構文とセマンティクスを規定している」 。 2010年8月22日時点のオリジナルよりアーカイブ。 2010年9月4日閲覧
  20. ^ 「PHP: 整数 - マニュアル」
  21. ^ ECMAScript 第6版ドラフト: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals 2013年12月16日アーカイブ、 Wayback Machine
  22. ^ "SmallBASIC | MAXINT" . 2025年1月20日閲覧。
  23. ^ 「Integer (Java Platform SE 8)」 . 2025年1月20日閲覧
  24. ^ 「数値の制限」 cppreference.com。
  25. ^ 「基本型の限界」 。 2025年1月20日閲覧
  26. ^ "std::numeric_limits" . cppreference.com.
  27. ^ 「プレリュード」
  28. ^ "28.1. sys — システム固有のパラメータと関数 — Python 2.7.18 ドキュメント" . docs.python.org . 2025年9月17日閲覧
  29. ^ 「sys — システム固有のパラメータと関数」 . Python 3.13.7 ドキュメント. 2025年9月17日閲覧
  30. ^ 「プリミティブ型 i32」 . doc.rust-lang.org/std.
  31. ^ Grogono, Peter (1995). 『チューリングプログラミングとオブジェクト指向チューリング』 ニューヨーク: Springer. p. 363. doi : 10.1007/978-1-4612-4238-3 . ISBN 978-0-387-94517-0LCCN  95010802