「2の補数」の版間の差分

提供:UnixClassWiki
ナビゲーションに移動 検索に移動
86行目: 86行目:
|}
|}


問題は負の値を表現する時です。
ここままでは負の値を表現できません。
そこで2の補数という表現方法を使ってみます。
そこで2の補数という表現方法を用います。
負の値を表現する時は一番上(最も左のビット)を負を示すサインに使います。
負の値を表現する時は一番上(最も左のビット)を負を示すサインに使います。
2^3 = 8ですが、それを負の値をみなしますので-8とします。
2^3 = 8ですが、それを負の値をみなしますので-8とします。

2016年5月15日 (日) 17:09時点における版

2の補数とは

2の補数とは2進法で負の値と正の値を表現する際に使われ表現形式です。 コンピュータの中でNビットの領域を使って整数を表現する時に使われます。 Nビットを使える時、最小値、最大値は以下のようになります。


最小値
最大値



ワード・バイト・ビットの単位とレジスタ

CPUとメモリではデータはバイト単位で格納されています。 1か0をあらす最小単位はビットで、8ビットで1バイトになります。 CPU内部で演算をするためのデータを格納している場所は(汎用)レジスタです。 CPUが1回に加算する単位はレジスタのサイズの単位です。そのサイズのことをワードと呼びます。 今日ではワードのサイズには4ビット、8ビット、16ビット、32ビット、64ビットというように2のN乗であるものが主流ですが、12ビットとか18ビットといったものもあります。

4ビットの整数表現を考えてみる

ここで4ビットが1ワードである整数表現を考えてみます。 正の値のみを取る表現だと次のように表現できます。

4ビットの状態 サインなし

10進数表現

0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15

ここままでは負の値を表現できません。 そこで2の補数という表現方法を用います。 負の値を表現する時は一番上(最も左のビット)を負を示すサインに使います。 2^3 = 8ですが、それを負の値をみなしますので-8とします。 それ以外のビットは正の値とします。 ですので 1111 は -8 + 7 = -1 となります。 では2の補数での表を作ってみます。


ビットパターンで並べる
4ビットの状態 整数

10進数表現

0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 -8
1001 -7
1010 -6
1011 -5
1100 -4
1101 -3
1110 -2
1111 -1


整数10進数でならべる
4ビットの状態 整数

10進数表現

0111 7
0110 6
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
1111 -1
1110 -2
1101 -3
1100 -4
1011 -5
1010 -6
1001 -7
1000 -8

2の補数を使っての計算

4ビットレジスタで1と-1を加算してみましょう。

1はビット表現では0001です。-1はビット表現では1111です。 0001と1111を加算すると2進数では10000です。 しかし4ビットレジスタなので、5ビット目ははみ出して落ちてしまい0000となります。 0000は0です。よって1に-1を加えた結果は0になることがわかります。

では7に-4を加える計算してみましょう。 0111と1100を加えると2進数10011となりレジスタの内容は0011となります。 0011は3です。7 + (-4) = 3 ですので同じだといことがわかります。


加算器と2の補数

1ビットレジスタの加算器をビット演算を行う回路でどのように表現を考えてみます。 ビット演算 AND、OR、XOR、NOTは次のような動作をします。

  • AND 双方のビットが1の時のみ1
  • OR どちらかのビットに1があれば1
  • XOR ビットが異なれば1、同じであれば0
  • NOT ビットを反転させる

1ビットだけの加算を考えると次のようになります。

0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 0

1+1が0なのは桁あふれだからです。この加算はXORのビット演算をしているのと同じです。 ですので、1ビットレジスタで加算はXORの回路と同等です(A XOR B → Sの図)。

A XOR B → Sの図


Half Adder と Full Adder

では2ビット加算器を考えてみましょう。01 + 01 の加算を考えてみます。

まず最初のビットは 1 + 1 です。ビットは0になります。次のビットに1を繰り上げます。 この回路のことをHalf Adderと呼びます。ビット演算回路で示すと下記のHalf Adderの図のようになります。

次のビットは下から繰り上がってきたビットも含めて計算することになります。 この回路のことをFull Adderと呼びます。ビット演算回路で示すと下記のFull Adderの図のようになります。


Half Adder の図

Full Adder の図

4ビット加算器

加算器はHalf AdderとFull Adderからなり、4ビット加算器は次のようになります。 最後の繰り上がりビットは無視され、どこにも影響をあたえません。

図4:


2の補数を使うと加算器で正の値と負の値を混在させ計算することが可能になります。