2の補数

提供: testwiki
ナビゲーションに移動 検索に移動

テンプレート:読み仮名は、テンプレート:Math位取り記数法の基数とした場合の基数の補数であるテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Efn2。すなわち、整数 テンプレート:Mvar とのが基数 テンプレート:Math テンプレート:Math となる数 テンプレート:Math2 のことをいうテンプレート:Efn2(例:テンプレート:Math2 について、テンプレート:Math に対応する2の補数は テンプレート:Math2)。

テンプレート:Mvar とその2の補数 テンプレート:Math二進法で表せば、2の補数 テンプレート:Mathテンプレート:Mvar との和が テンプレート:Math2 桁に繰り上がる最小の数といえる(例:テンプレート:Math2 についてテンプレート:Efn2テンプレート:Math2 に対応する2の補数は テンプレート:Math2)。

2の補数を得る手順は、基数の補数および減基数の補数の定義から、1の補数テンプレート:Math を足す操作となる。1の補数は二進表示された数の各位の値(ビット)を テンプレート:Math から テンプレート:Math、また テンプレート:Math から テンプレート:Math に置き換える操作(ビット反転)によって得られるため(例:テンプレート:Math2)、2の補数はしばしば元の数をビット反転して1を足したものとして定義される。

ある数の2の補数を反数と見なせば、二進法において決まった桁数を持った数をそれぞれ非負の数と負の数に対応づけられる(#負の数の表現)。 特に テンプレート:Mvar 桁の二進数について テンプレート:Math から テンプレート:Math(例:テンプレート:Math なら テンプレート:Math から テンプレート:Math)の範囲で符号なし表現と一致させたものはテンプレート:読み仮名またはテンプレート:読み仮名と呼ばれる(#2の補数表現)。

2の補数表現はコンピュータの分野において、固定長符号付きの整数型固定小数点数の表現に利用されている。

また2の補数表現は加算器で減算をするために使われる。

計算例

以下に#2の補数表現における計算例を示す。

補数であることの確認

例えば、4桁の二進数 テンプレート:Math2 に対する2の補数は テンプレート:Math である。実際、これらを足し算は以下のようになる:

0010+111010000

結果は テンプレート:Math2 になっており、テンプレート:Mathテンプレート:Mathテンプレート:Math2 に対する補数になっていることが確かめられる。また5桁目以降を無視し下4桁だけ取り出せば、結果は テンプレート:Math となる。つまり、テンプレート:Math にその2の補数 テンプレート:Math を足すということは テンプレート:Math から テンプレート:Math 自身を引くということと同じ意味を持つ。言い換えれば、 テンプレート:Math2 は負数 テンプレート:Math を表している。

引き算と補数の足し算の比較

例えば、二進数 テンプレート:Math2 から二進数 テンプレート:Math2 を引く場合、以下のように計算できる:

010100110010

一方、二進数 テンプレート:Math の2の補数 テンプレート:Math を足す計算は、以下のようになる:

0101+110110010

5桁目以降を無視し下4桁を取り出せば、こちらも結果は テンプレート:Math2 になり、引き算の場合と一致する。また、テンプレート:Math は負数 テンプレート:Math を表していることが分かる。

算術オーバーフローの例

足し算の結果、算術オーバーフローが起きることがある。

例えば、二進数 テンプレート:Math2 と二進数 テンプレート:Math2 の足し算は以下のように計算できる:

0101+00111000

結果は テンプレート:Math2 となるが、これは2の補数表現において負の整数 テンプレート:Math に対応し、通常の足し算で期待される結果 テンプレート:Math2 と一致しない。

同様に、二進数 テンプレート:Math2 と二進数 テンプレート:Math2 の足し算は期待する結果を与えない:

1101+101010111

結果は テンプレート:Math2 となり、通常の足し算で期待される結果 テンプレート:Math2 と一致しない。

負の数の表現

2の補数を用いて、二進法で表された数(二進数)を整数に対応づけられる。2の補数の定義より、テンプレート:Mvarテンプレート:Efn2の二進数 テンプレート:Mvar とその補数 テンプレート:Math は以下の関係を満たすテンプレート:Sfn

x+xc=2n(xc=2nx).

テンプレート:Math倍数テンプレート:Math と同一視すれば、上記の補数の関係は テンプレート:Math を法とする合同式に置き換えられるテンプレート:Sfn

x+xc0(mod2n).

これは テンプレート:Mvar の補数 テンプレート:Mathテンプレート:Mvar反数 テンプレート:Math と見なすことを意味する。すなわち、数 テンプレート:Mvar から テンプレート:Mvar を引く操作は、数 テンプレート:Mvar と補数 テンプレート:Mathたし算に置き換えられるテンプレート:Sfnテンプレート:Sfn

yxy+2nxy+xc(mod2n).

同様に反数 テンプレート:Mathかけ算は補数の積に置き換えられるテンプレート:Sfn

y(x)y2n+y(x)yxc(mod2n).

#負の数の表現節の方法で負の数の計算を行えるが、具体的な数値計算を行うには、どの二進数ビット列)がどの数値を表すかという対応関係を定義しなければならない。テンプレート:Math から テンプレート:Math までの非負整数をそのまま通常の位取り記数法における二進表示、

002,112,2102,2n12011102,2n1101111n2

に対応づければ、これらの数の補数として整数に対する2の補数表現が得られる:

2n12n1100002,2n1+112n1100012,2n22111102,2n11111112.

具体例として、テンプレート:Mathテンプレート:Efn2の二進数における対応表を示す:

テンプレート:Math についての2の補数表現における、二進数(ビット列)と対応する数値の一覧
対応する数値 二進数 対応する数値 二進数
テンプレート:Math テンプレート:Math - -
テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
- - テンプレート:Math テンプレート:Math

結局、テンプレート:Mvar 桁の二進数の テンプレート:Math 桁目の値を テンプレート:Math とすれば、2の補数表現は以下のように表せるテンプレート:Sfn

bn1bn2b1b0(2)bn12n1+k=0n2bk2k.

最上位ビット テンプレート:Mathテンプレート:読み仮名と呼ばれ、数値の正負を決定する。すなわち、符号ビットが テンプレート:Math なら非負の数値を表し、テンプレート:Math なら負の数値を表す。

上記の数の補数は、以下のように表せる:

(bn1bn2b1b0(2))c1(1bn1)2n1+k=0n2(1bk)2k.

等比数列の和 k=0n22k=2n11 を用いれば、上記の補数は以下のようにも表せるテンプレート:Sfn

(bn1bn2b1b0(2))cbn12n1k=0n2bk2k.

これは結局、元の数に負符号を付けた形となっている(ただし元の数が テンプレート:Math の場合は算術オーバーフローが発生する。オーバーフローをチェックせずラップアラウンドする場合、テンプレート:Math 自身へ写るテンプレート:Efn2)。

2の補数表現の性質

符号なし整数との一致

2の補数表現は、符号ビットが テンプレート:Math なら符号なし整数表現(つまり通常の二進法)に一致するテンプレート:Sfn。この性質は符号・絶対値表現1の補数表現も持っている。

最小値と最大値の非対称性

2の補数表現において、テンプレート:Mvar 桁(テンプレート:Mvar 個のビット)の二進数で表せる数値の範囲は テンプレート:Math2 から テンプレート:Math2 までであるテンプレート:Sfn(例: テンプレート:Math2 の場合、テンプレート:Math2 から テンプレート:Math2)。最小値と最大値の絶対値を比較すると、負の数の範囲は正の数の範囲に対して テンプレート:Math だけ大きく、非対称になっている。そのため、最小値の補数を求めようとすると算術オーバーフローが生じる(汎整数拡張によって型が格上げされる場合は除く)。この性質は符号・絶対値表現1の補数表現にはなく、符号・絶対値表現および1の補数表現での数値の範囲は テンプレート:Math2 から テンプレート:Math2 までと対称的になっている。

偶奇性の判定

2の補数表現において、整数偶奇性を判定するには最下位の桁(最下位ビット)が偶数奇数かを判定すればよい。すなわち二進数表示の最下位の値 テンプレート:Mathテンプレート:Math なら偶数であり テンプレート:Math なら奇数であることが示せるテンプレート:Sfn。同じ性質は符号・絶対値表現も持つが、1の補数表現においては最上位の桁(最上位ビット)の検査が必要であり、最上位ビットが テンプレート:Math なら最下位ビットが テンプレート:Math、最上位ビットが テンプレート:Math なら最下位ビットが テンプレート:Math の場合に偶数となる。

正負の判定

2の補数で表される数は、符号ビット(最上位ビットテンプレート:Mathテンプレート:Math なら非負の値を取り テンプレート:Math なら負の値を取るテンプレート:Sfn。すなわち、負値か非負値かの判定は符号ビットのみから判別できる。符号・絶対値表現や1の補数表現ではゼロを表す二進数が一意でなく、符号ビットが テンプレート:Mathテンプレート:Math と符号ビットが テンプレート:Mathテンプレート:Math があるため、テンプレート:Math が許容される限り、これらの表現では符号ビットのみから負数か非負数かを判定できない。

1の補数との関係

2の補数表現において、テンプレート:Math は常にすべての位の値が テンプレート:Math の二進数 テンプレート:Math に対応づけられる。従って、数をビット列とみなせば、ビット列 テンプレート:Mvar とそのビットを反転テンプレート:Efn2させたビット列 テンプレート:Math は常に以下を満たす:

x+fx1(mod2n).

上記より、テンプレート:Mvar の2の補数は テンプレート:Math と表せる。従って減法は、

yxy+fx+1(mod2n)

と書き換えられる。ビット反転はまた1の補数を得る操作でもある。

fx1x(2n1)x(mod2n).

右辺の テンプレート:Math2テンプレート:Mvar に対する1の補数そのものであるから、ビット反転は1の補数を得る操作になっている。

元の数とのビットの一致

テンプレート:Mvarテンプレート:Mvar 桁の二進数表示の下位 テンプレート:Math2 桁目まで位の値が テンプレート:Math だった場合、2の補数 テンプレート:Math2 を求める際、ビット反転した値が桁上りによって再び反転するため、下位 テンプレート:Math2テンプレート:Efn2桁まで元の数とその2の補数の値が一致する。また残りの上位 テンプレート:Math2 桁は、ビット反転 テンプレート:Math の上位 テンプレート:Math2 桁に一致する。例えば、補数と元の数の位の値が一致する部分に下線を引けば、テンプレート:Math のビット反転は テンプレート:Math2 であり、2の補数は テンプレート:Math2 となる。同様に、テンプレート:Math および テンプレート:Math のビット反転はそれぞれ テンプレート:Math, テンプレート:Math であり、2の補数はそれぞれ テンプレート:Math, テンプレート:Math となる(表も参照)。

テンプレート:Math についての2の補数表現における、補数と元の数との下位ビットの一致テンプレート:Efn2
元の数と一致する下位ビットの桁数(テンプレート:Mvar 1 2 3 4 4
元の数(テンプレート:Mvar テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
ビット反転(テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math
2の補数(テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math テンプレート:Math

脚注

テンプレート:脚注ヘルプ

注釈

テンプレート:Notelist2

出典

テンプレート:Reflist

参考文献

関連項目