コンピュータの数値形式は、プログラム可能なコンピュータや計算機などのデジタル機器のハードウェアおよびソフトウェアにおける数値の内部表現である。[1] 数値は、バイトやワードなどのビットのグループとして格納される。数値とビットパターン間のエンコードは、コンピュータの操作の便宜上選択される。[要出典]コンピュータの命令セットで使用されるエンコードは、一般に、印刷や表示などの外部使用のために変換を必要とする。プロセッサの種類によって数値の内部表現が異なり、整数と実数には異なる規則が使用される。ほとんどの計算はプロセッサのレジスタに収まる数値形式で実行されるが、一部のソフトウェアシステムでは、複数ワードのメモリを使用して任意の大きな数値を表現できる。
2進数の表現
コンピュータはデータを 2 進数の集合で表現します。表現はビットで構成され、ビットはさらにバイトなどのより大きな集合にグループ化されます。
ビットは、2 つの状態のうちの 1 つを表す2 進 数です。ビットの概念は、1または0、オンまたはオフ、はいまたはいいえ、真または偽、あるいは何らかの スイッチまたはトグルによってエンコードされた値として理解できます。
1 ビットだけでは 2 つの値しか表せませんが、ビットの文字列を使用すると、より大きな値を表すことができます。たとえば、表 1 に示すように、3 ビットの文字列は最大 8 つの異なる値を表すことができます。
文字列を構成するビット数が増えると、0と1 の組み合わせの数は指数関数的に増加します。1 ビットでは 2 つの値の組み合わせしか許可されませんが、2 ビットを組み合わせると 4 つの別々の値を作成でき、3 ビットを組み合わせると 8 つの値を作成でき、というように、式 2 nで増加します。表 2 に示すように、2 進数が追加されるごとに、可能な組み合わせの数は 2 倍になります。
特定のビット数のグループは、さまざまなものを表すために使用され、特定の名前が付けられます。
バイトは、文字を表すために必要なビット数を含むビット文字列です。最近のほとんどのコンピュータでは、これは 8 ビット文字列です。バイトの定義は文字を構成するビット数に関連しているため、一部の古いコンピュータではバイトに異なるビット長が使用されています。[2] 多くのコンピュータアーキテクチャでは、バイトはアドレス指定可能な最小単位、つまりアドレス指定可能領域の原子です。たとえば、64 ビットプロセッサは一度に 64 ビットのメモリをアドレス指定できますが、そのメモリを 8 ビットの部分に分割する場合があります。これをバイト アドレス指定可能なメモリと呼びます。歴史的に、多くのCPU は8 ビットの倍数でデータを読み取ります。[3] 8 ビットのバイトサイズは非常に一般的ですが、定義が標準化されていないため、 8 ビットシーケンスを明示的に表すためにオクテットという用語が使用されることがあります。
ニブル(ニブルとも呼ばれる)は、4ビットで構成される数字です。[4]ニブルは半バイト なので、言葉遊びで名付けられました。何かを一口食べるのに複数のニブルが必要な場合があります。同様に、ニブルはバイトの一部です。4ビットで16個の値が可能なので、ニブルは16進数と呼ばれることもあります。[5]
8進数と16進数の表示
8 進数と 16 進数のエンコードは、コンピューターで使用される 2 進数を表す便利な方法です。コンピューター エンジニアは 2 進数の値を書き出す必要があることがよくありますが、実際には 1001001101010001 のような 2 進数の値を書き出すのは面倒で、間違いが起きやすくなります。そのため、2 進数は 8 進数、つまり「8 進数」、またはもっと一般的には 16 進数、つまり「16 進数」( hex ) の数値形式で書き出されます。10 進数では、0 から 9 までの 10 桁の数字が組み合わさって数字になります。8 進数では、0 から 7 までの 8 桁しかありません。つまり、8 進数の「10」の値は 10 進数の「8」と同じで、8 進数の「20」は 10 進数の「16」と同じ、というようになります。 16 進数では、慣例により 0 から 9 までの 16 桁の数字があり、その後に A から F が続きます。つまり、16 進数の「10」は 10 進数の「16」と同じであり、16 進数の「20」は 10 進数の「32」と同じです。異なる基数の数値の例と比較については、下の表を参照してください。
数字を入力するときは、数値システムを表すために書式設定文字が使用されます。たとえば、2 進数の場合は 000_0000B または 0b000_00000、16 進数の場合は 0F8H または 0xf8 です。
基数間の変換
これらの数値システムはいずれも位置システムですが、10 進数の重みは 10 の累乗であるのに対し、8 進数の重みは 8 の累乗、16 進数の重みは 16 の累乗です。16 進数または 8 進数を 10 進数に変換するには、各桁の値にその位置の値を掛け、その結果を加算します。例:
分数を2進数で表す
固定小数点数
固定小数点形式は、分数を 2 進数で表す場合に便利です。
数値の小数部と整数部を格納するには、必要な精度と範囲に必要なビット数を選択する必要があります。たとえば、32 ビット形式を使用する場合、整数に 16 ビット、小数部に 16 ビットを使用できます。
8 の位のビットの次には 4 の位のビット、2 の位のビット、1 の位のビットが続きます。小数ビットは整数ビットによって設定されたパターンを継続します。次のビットは 2 分の 1 のビット、その次は 1/4 のビット、その次は 1/8 のビット、というように続きます。例:
この形式のエンコードでは、バイナリで表現できない値があります。たとえば、分数1/5、小数で0.2の場合、最も近い近似値は次のようになります。
より多くの桁数を使用しても、正確な表現は不可能です。数値1/3は、10進数で0.333333333...と表記され、無限に続きます。途中で終了した場合、値はを表しません。1/3まさにその通りです。
浮動小数点数
デジタル システムでは符号なし整数と符号付き整数の両方が使用されていますが、32 ビット整数であっても、計算機が処理できる数値の範囲全体を処理するには不十分であり、分数も含まれていません。実数のより広い範囲と精度に近似するには、符号付き整数と固定小数点数を放棄し、「浮動小数点」形式に移行する必要があります。
10 進法では、次のような形式 (科学的記数法)の浮動小数点数が一般的です。
- 1.1030402 × 10 5 = 1.1030402 × 100000 = 110304.02
または、より簡潔に言うと:
- 1.1030402E5
これは「1.1030402 の 1 倍の後に 5 つのゼロが続く」という意味です。「仮数」と呼ばれる特定の数値 (1.1030402)に 10 の累乗 (E5、10 5または 100,000 を意味する) を掛けたものが「指数」です。指数が負の場合、小数点の右側の桁数だけ 1 が掛けられていることを意味します。例:
- 2.3434E−6 = 2.3434 × 10 −6 = 2.3434 × 0.000001 = 0.0000023434
この方式の利点は、指数を使用することで、仮数の桁数、つまり「数値精度」が範囲よりはるかに小さい場合でも、はるかに広い範囲の数値を取得できることです。 同様のバイナリ浮動小数点形式をコンピューター用に定義できます。 このような方式は多数ありますが、最も一般的なのは米国電気電子技術者協会(IEEE) によって定義されたものです。IEEE 754-2008標準仕様では、次の 64 ビット浮動小数点形式が定義されています。
- 11 ビットの 2 進指数。"excess-1023" 形式を使用します。excess-1023 は、指数が 0 から 2047 までの符号なし 2 進整数として表示されることを意味します。1023 を引くと、実際の符号付き値が得られます。
- 52 ビットの仮数部、これも符号なしの 2 進数で、先頭に暗黙の「1」が付いた小数値を定義します。
- 数値の符号を示す符号ビット。
8 バイトのメモリに格納されたビットの場合:
ここで、「S」は符号ビット、「x」は指数ビット、「m」は仮数ビットを表します。ここでビットが抽出されると、次の計算で変換されます。
- <符号> × (1 + <小数点以下>) × 2 <指数> − 1023
この方式では、次の数値の範囲で、約 15 桁の 10 進数まで有効な数値が提供されます。
仕様では、定義されていない数値であるNaN (Not A Number) と呼ばれる特殊な値もいくつか定義されています。これらはプログラムによって無効な操作などを指定するために使用されます。
一部のプログラムでは、32 ビットの浮動小数点数も使用されます。最も一般的な方式では、符号ビット付きの 23 ビットの仮数と、「超過 127」形式の 8 ビットの指数が使用され、7 つの有効な 10 進数字が生成されます。
ビットは次の計算によって数値に変換されます。
- <符号> × (1 + <小数点以下>) × 2 <指数> − 127
次の数値の範囲が導き出されます。
このような浮動小数点数は一般に「実数」または「浮動小数点数」と呼ばれますが、いくつかのバリエーションがあります。
32 ビットの float 値は、「単精度浮動小数点値」を意味する「real32」または「single」と呼ばれることもあります。
64 ビット float は、「倍精度浮動小数点値」を意味する「real64」または「double」と呼ばれることもあります。
数値とビット パターンの関係は、コンピューター操作の利便性のために選択されています。コンピューターのメモリに格納される 8 バイトは、64 ビット実数、2 つの 32 ビット実数、4 つの符号付きまたは符号なし整数、または 8 バイトに収まるその他の種類のデータを表すことができます。唯一の違いは、コンピューターがそれらを解釈する方法です。コンピューターが 4 つの符号なし整数を格納し、それをメモリから 64 ビット実数として読み戻すと、ほとんどの場合、完全に有効な実数になりますが、ジャンク データになります。
与えられたビット数で表現できるのは、有限の範囲の実数だけです。算術演算ではオーバーフローやアンダーフローが発生し、表現できないほど大きい値や小さい値が生成されることがあります。
表現の精度には制限があります。たとえば、64 ビットの実数では 15 桁の 10 進数しか表現できません。非常に小さい浮動小数点数を大きい数に加算すると、結果は大きい数だけになります。小さい数は 15 桁または 16 桁の解像度では表示できないほど小さいため、コンピューターはそれを事実上破棄します。制限された精度の影響を分析することは、よく研究されている問題です。丸め誤差の大きさの推定と、大規模な計算への影響を制限する方法は、あらゆる大規模計算プロジェクトの一部です。精度の制限は範囲の制限とは異なり、指数ではなく仮数に影響します。
仮数は2進小数であり、必ずしも小数と完全に一致するわけではありません。多くの場合、2の逆数の累乗の合計は特定の小数と一致しないため、計算結果はわずかにずれます。たとえば、小数「0.1」は、無限に繰り返される2進小数に相当します。0.000110011 ... [6]
プログラミング言語における数字
アセンブリ言語でプログラミングする場合、プログラマーは数値の表現を追跡する必要があります。プロセッサが必要な数学演算をサポートしていない場合、プログラマーは演算を実行するための適切なアルゴリズムと命令シーケンスを作成する必要があります。一部のマイクロプロセッサでは、整数の乗算もソフトウェアで行う必要があります。
RubyやPythonなどの高水準プログラミング言語では、有理数、bignum、複素数などの拡張型である抽象数を提供しています。数学演算は、言語の実装によって提供されるライブラリ ルーチンによって実行されます。ソース コード内の特定の数学記号は、演算子のオーバーロードによって、数値型の表現に適した異なるオブジェクト コードを呼び出します。つまり、符号付き、符号なし、有理数、浮動小数点数、固定小数点数、整数、複素数など、あらゆる数値に対する数学演算は、まったく同じ方法で記述されます。
REXXやJavaなどの一部の言語では、異なる形式の丸め誤差を提供する 10 進浮動小数点演算が提供されます。
参照
注釈と参考文献
この記事の最初のバージョンは、Greg Goebel の Vectorsite のパブリック ドメインの記事に基づいています。
- ^ Jon Stokes (2007)。『Inside the machine: an illustrated introduction to microprocessors and computer architecture』No Starch Press。66 ページ。ISBN 978-1-59327-104-6。
- ^ 「バイト定義」 。 2012年4月24日閲覧。
- ^ 「マイクロプロセッサとCPU(中央処理装置)」。ネットワーク辞書。2017年10月3日時点のオリジナルよりアーカイブ。2012年5月1日閲覧。
- ^ 「nybble definition」 . 2012年5月3日閲覧。
- ^ 「Nybble」。TechTerms.com 。 2012年5月3日閲覧。
- ^ Goebel, Greg. 「コンピュータ番号形式」 。 2012年9月10日閲覧。
