差分

2の補数

1,267 バイト追加, 2016年5月15日 (日) 18:33
/* 補足 */
== 2の補数とは ==
2の補数とは2進法で負の値と正の値を表現する際に使われ表現形式です。2の補数とは2進法を用いて負の値と正の値を表現する際に使われ表現形式です。
コンピュータの中でNビットの領域を使って正の値と負の値を持った整数を表現する時に使われます。
表現にNビットを使える時、最小値、最大値は以下のようになります。最上位ビットを負を意味するサインに使います。負の値を示すとき、最上位ビットが1が立っています。その時、-2のN乗の値に最上位ビット以外である0からN-2ビット目<ref>0オリジン</ref>までで表している正の整数の値を加えたものが負の整数の値となります。表現でNビットを使う整数の、最小値、最大値は以下のようになります。
{|class="wikitable"
|+ ビット状態と正10進数との対応
|-
|4ビットの状態
|サインなし
それ以外のビットは正の値とします。
ですので ''1111'' は -8 + 7 = -1 となります。
では2の補数での表を作ってみます。  2の補数では次のようになります。
{|class="wikitable sortable"
|+ ビットパターンで並べるビット状態と正負10進数の対応
!4ビットの状態!!10進数表現
|-
|}
== 2の補数を使っての計算 2の補数を使っての加算 ==
4ビットレジスタで1と-1を加算してみましょう。
4ビットレジスタで1と-1を加算してみましょう。
1はビット表現では0001です。-1はビット表現では1111です。
0001と1111を加算すると2進数では10000です。
0000は0です。よって1に-1を加えた結果は0になることがわかります。
では7にこんどは7に-4を加える計算してみましょう。
0111と1100を加えると2進数10011となりレジスタの内容は0011となります。
0011は3です。7 + (-4) = 3 ですので同じだといことがわかります。
 
== 加算器と2の補数 ==
では2ビット以上の加算器<ref>暗黙の了承としてビックエンディアンとします。</ref>を考えてみましょう。ここではまず01 + 01 の加算を考えてみます。
まず最初のビットは 1 + 1 です。ビットは0になります。次のビットに1を繰り上げます。です。加算後のビット<ref>加算後の値のことをSumといいます。</ref>は0になります。そして次のビットに1を繰り上げ<ref>繰り上げのことをCarryといいます。</ref>ます。この回路のことをHalf Adderと呼びます。ビット演算回路で示すと下記のAdderと呼びます。ビット演算回路で示すと下記の「'''Half Adder'''の図のようになります。の図」のようになります。
次のビット以降は下から繰り上がってきたビットも含めて計算することになります。
この回路のことをFull Adderと呼びます。ビット演算回路で示すと下記のAdderと呼びます。ビット演算回路で示すと下記の「'''Full Adder'''の図のようになります。の図」のようになります。
|-
|}
 
 
=== 4ビット加算器 ===
このように2の補数を使うと加算器で整数(正の値と負の値)を計算することが可能になります。このように2の補数を使うと加算器で整数(正の値と負の値)を計算することが出来ます。 == 補足 == 現在は2進数で計算を行うのがあたりまえになっていますが、効率的であるかどうかの議論を除けば、計算には3進法でも10進法でも構わなく、過去には[https://en.wikipedia.org/wiki/Ternary_computer 3進法のコンピュータ ]も存在しています。[https://en.wikipedia.org/wiki/Decimal_computer 10進法で計算するコンピュータ]ですが、コンピュータ黎明期のマシンとして有名な[https://en.wikipedia.org/wiki/ENIAC ENIAC]は10進数をベースに計算しています。ENIACの後継機として設計された[https://en.wikipedia.org/wiki/EDVAC EDVAC]では2進数を採用しています。
== 脚注 ==