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

削除された内容 追加された内容
編集の要約なし
1行目:
'''2の補数'''(にのほすう)は、2、ないし2のべき乗の[[補数]]、またそれによる負の値の表現法である。特に[[二進法]]で使われる。(数学的あるいは理論的には、三進法における減基数による補数、すなわち 3<sup>n</sup>-1 = 2222....2222<sub>(三進)</sub> による補数も「2の補数」であるが、まず使われることはない)
 
[[コンピュータ]]の固定長[[整数型]]や、[[固定小数点数]]で、負の値を表現するためや[[加算器]]で減算をするために使われる。
 
頭の部分の1個以上の0を含む(正規化されていない)ある桁数の二進法で表現された数があるとき、その最上位ビット (MSB) よりひとつ上のビットが1で、残りが全て0であるような値(8ビットの整数であれば、100000000<sub>(二進)</sub> = 256)から、元の数を引いた数が'''2の補数'''である。MSBの重みが1であるような固定小数点表現の場合は特に「2」の補数となる。
 
== 例 ==
-36(−36([[十進法]])が、8ビットで、2の補数でどのように表されるかを例として示す。
 
二進法8ビットで、36は 00100100 である。
100000000 (256)(256)
-) 00100100 (36) (36)
-------------
11011100 (220)(220)
 
したがって、'''2の補数'''による-36−36の表現は 11011100 (十進表現で220)である。
 
元の数(00100100) (00100100) と求められた(11011100) (11011100) の2つの数を足し合わせると、すべての桁が 0 になり、負数が求められていることがわかる(最上位桁からの桁上がりの 1 は無視する)。
 
=== 別の求め方 ===
「1の補数に1を加える」という方法もある。算術的に考えると、(たとえばこの例の場合)「256-36」という計算を「(255-36) + 1」に分解している。
 
まず
00100100 の各ビットを反転させる(1の補数を求める)と、
11011011
次に1を加えると、
11011011
+) 1
------------
11011100
 
33行目:
 
== 1の補数 ==
二進法における、減基数すなわち 2<sup>n</sup>-1 による補数を'''1の補数'''と言う。1の補数は、全ての桁が1である値から、元の値を引けば求まるが、各ビットの1を0に、0を1に、と反転させても求められる。
00100100(元の数)
11011011(1の補数)
39行目:
 
== 負の数の値 ==
2の補数で表現された負の数の値を考えるには、二進法の各桁の重みについて、最上位ビット(MSB) (MSB) のみ符号が反転したものとして計算すれば良い。
 
たとえば 1101<sub>2</sub> は、符号無しの二進法であれば、2<sup>3</sup> + 2<sup>2</sup> + 2<sup>0</sup> = 8 + 4 + 1 = 13 であるが、2の補数表現による負の数であるとした場合は、'''-2−2<sup>3</sup>''' + 2<sup>2</sup> + 2<sup>0</sup> = '''-8−8''' + 4 + 1 = -3−3 である。
 
1111 1111 1111 0001<sub>2</sub> のような、上位側に1が並んだ数の場合も同様にして求めてもよいが、正の数の時に、上位側の0を無視するように、1が連続する間は無視し、最後の1の重みを負として、そこから下位の桁について同様に計算してもよい。
 
1111 1111 1111 0001<sub>2</sub> の場合、-16−16 + 1 で、-15−15 である。
 
== 十進法との対応 ==