2の補数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
2013年7月17日 (水) 16:31時点における131.113.58.74 (トーク)による版 ()
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

2の補数(にのほすう)は、2、ないし2のべき乗の補数、またそれによる負の値の表現法である。特に二進法で使われる。(数学的あるいは理論的には、三進法における減基数による補数、すなわち 3n − 1 = 2222....2222(三進) による補数も「2の補数」であるが、まず使われることはない)

コンピュータの固定長整数型や、固定小数点数で、負の値を表現するためや加算器で減算をするために使われる。

頭の部分の1個以上の0を含む(正規化されていない)ある桁数の二進法で表現された数があるとき、その最上位ビット (MSB) よりひとつ上のビットが1で、残りが全て0であるような値(8ビットの整数であれば、100000000(二進) = 256)から、元の数を引いた数が2の補数である。MSBの重みが1であるような固定小数点表現の場合は特に「2」の補数となる。

−36(十進法)が、8ビットで、2の補数でどのように表されるかを例として示す。

二進法8ビットで、36は 00100100 である。

   100000000 (256)
-)  00100100  (36)
------------
    11011100 (220)

したがって、2の補数による−36の表現は 11011100 (十進表現で220)である。

元の数 (00100100) と求められた (11011100) の2つの数を足し合わせると、すべての桁が 0 になり、負数が求められていることがわかる(最上位桁からの桁上がりの 1 は無視する)。

別の求め方

「1の補数に1を加える」という方法もある。算術的に考えると、(たとえばこの例の場合)「256 − 36」という計算を「(255 − 36) + 1」に分解している。

まず

00100100 の各ビットを反転させる(1の補数を求める)と、
11011011

次に1を加えると、

   11011011
+)        1
-----------
   11011100

得られた値は、上記の値と同じことが分かる。

1の補数

二進法における、減基数すなわち 2n − 1 による補数を1の補数と言う。1の補数は、全ての桁が1である値から、元の値を引けば求まるが、各ビットの1を0に、0を1に、と反転させても求められる。

00100100(元の数)
11011011(1の補数)
11011100(2の補数)

負の数の値

2の補数で表現された負の数の値を考えるには、二進法の各桁の重みについて、最上位ビット (MSB) のみ符号が反転したものとして計算すれば良い。

たとえば 11012 は、符号無しの二進法であれば、23 + 22 + 20 = 8 + 4 + 1 = 13 であるが、2の補数表現による負の数であるとした場合は、−23 + 22 + 20 = −8 + 4 + 1 = −3 である。

1111 1111 1111 00012 のような、上位側に1が並んだ数の場合も同様にして求めてもよいが、正の数の時に、上位側の0を無視するように、1が連続する間は無視し、最後の1の重みを負として、そこから下位の桁について同様に計算してもよい。

1111 1111 1111 00012 の場合、−16 + 1 で、−15 である。

十進法との対応

十進表記 4ビット整数表記
−8 1000
−7 1001
−6 1010
−5 1011
−4 1100
−3 1101
−2 1110
−1 1111
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111