トップQs
タイムライン
チャット
視点

2の補数

数 x に対して和 x + y が2の冪乗になる数 y ウィキペディアから

Remove ads
Remove ads

2の補数にのほすう: two's complementは、2位取り記数法の基数とした場合の基数の補数である[1][2][3][4][5][6][注 1]。すなわち、整数 x とのが基数 2 2n となる数 xc = 2n x のことをいう[注 3](例:24 = 16 について、5 に対応する2の補数は 11 = 16 5)。

x とその2の補数 xc二進法で表せば、2の補数 xcx との和が n + 1 桁に繰り上がる最小の数といえる(例:24 = 100002 = (1111 + 1)2 について[注 2]510 = 01012 に対応する2の補数は 1110 = 10112 = (1111 0101 + 1)2)。

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

ある数の2の補数を反数と見なせば、二進法において決まった桁数を持った数をそれぞれ非負の数と負の数に対応づけられる(#負の数の表現)。 特に n 桁の二進数について 0 から 2n1 1(例:n = 8 なら 0 から 127)の範囲で符号なし表現と一致させたものは2の補数表現にのほすうひょうげん: two's complement representationまたは2の補数表記にのほすうひょうき: two's complement notationと呼ばれる(#2の補数表現)。

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

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

Remove ads

計算例

要約
視点

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

補数であることの確認

例えば、4桁の二進数 00102 (= 2) に対する2の補数は 11102 である。実際、これらを足し算は以下のようになる:

結果は 100002 = 24 = 16 になっており、1110200102100002 に対する補数になっていることが確かめられる。また5桁目以降を無視し下4桁だけ取り出せば、結果は 00002 となる。つまり、00102 にその2の補数 11102 を足すということは 0010 から 0010 自身を引くということと同じ意味を持つ。言い換えれば、 11102 は負数 2 を表している。

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

例えば、二進数 01012 (= 5) から二進数 00112 (= 3) を引く場合、以下のように計算できる:

一方、二進数 00112 の2の補数 11012 を足す計算は、以下のようになる:

5桁目以降を無視し下4桁を取り出せば、こちらも結果は 00102 (= 2) になり、引き算の場合と一致する。また、11012 は負数 3 を表していることが分かる。

算術オーバーフローの例

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

例えば、二進数 01012 (= 5) と二進数 00112 (= 3) の足し算は以下のように計算できる:

結果は 10002 となるが、これは2の補数表現において負の整数 8 に対応し、通常の足し算で期待される結果 5 + 3 = 8 と一致しない。

同様に、二進数 11012 (= 3) と二進数 10102 (= 6) の足し算は期待する結果を与えない:

結果は 01112 (= 7) となり、通常の足し算で期待される結果 (3) + (6) = 9 と一致しない。

Remove ads

負の数の表現

要約
視点

2の補数を用いて、二進法で表された数(二進数)を整数に対応づけられる。2の補数の定義より、n[注 4]の二進数 x とその補数 xc は以下の関係を満たす[7]

2n倍数0 と同一視すれば、上記の補数の関係は 2n を法とする合同式に置き換えられる[8]

これは x の補数 xcx反数 x と見なすことを意味する。すなわち、数 y から x を引く操作は、数 y と補数 xcたし算に置き換えられる[9][10]

同様に反数 xかけ算は補数の積に置き換えられる[10]

Remove ads

2の補数表現

要約
視点

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

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

具体例として、n = 4[注 4]の二進数における対応表を示す:

さらに見る 対応する数値, 二進数 ...

結局、n 桁の二進数の k + 1 桁目の値を bk {0, 1} とすれば、2の補数表現は以下のように表せる[11]

最上位ビット bn1符号ビットふごうビット: sign bitと呼ばれ、数値の正負を決定する。すなわち、符号ビットが 0 なら非負の数値を表し、1 なら負の数値を表す。

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

等比数列の和 を用いれば、上記の補数は以下のようにも表せる[11]

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

Remove ads

2の補数表現の性質

要約
視点

符号なし整数との一致

2の補数表現は、符号ビットが 0 なら符号なし整数表現(つまり通常の二進法)に一致する[14]。この性質は符号・絶対値表現1の補数表現も持っている。

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

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

偶奇性の判定

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

正負の判定

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

1の補数との関係

2の補数表現において、1 は常にすべての位の値が 1 の二進数 111...112 に対応づけられる。従って、数をビット列とみなせば、ビット列 x とそのビットを反転[注 6]させたビット列 fx は常に以下を満たす:

上記より、x の2の補数は xc = fx + 1 と表せる。従って減法は、

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

右辺の (2n 1) xx に対する1の補数そのものであるから、ビット反転は1の補数を得る操作になっている。

元の数とのビットの一致

xn 桁の二進数表示の下位 m 1 桁目まで位の値が 0 だった場合、2の補数 fx + 1 を求める際、ビット反転した値が桁上りによって再び反転するため、下位 M = min(m, n)[注 7]桁まで元の数とその2の補数の値が一致する。また残りの上位 n M 桁は、ビット反転 fx の上位 n M 桁に一致する。例えば、補数と元の数の位の値が一致する部分に下線を引けば、x = 0100 のビット反転は fx = 1011 であり、2の補数は fx + 1 = 1100 となる。同様に、1000 および 0000 のビット反転はそれぞれ 0111, 1111 であり、2の補数はそれぞれ 1000, 0000 となる(表も参照)。

さらに見る 元の数と一致する下位ビットの桁数(M), 元の数(x) ...
Remove ads

脚注

Loading content...

参考文献

関連項目

Loading content...
Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads