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

後半をどうしたものか
編集の要約なし
(後半をどうしたものか)
'''2の補数'''(にのほすう)は、通常は2、ないし2のべき乗の[[2進|2]]、またそれによる負の値の表現法である。特に[[二進法]]で使われる。(数学的あるいは理論的には、三進法における減基数による補数、すなわち 3<sup>n</sup>-1 = 2222....2222<sub>(三進)</sub> による補数も「2の[[補数]]のことであるが、まず使われることはない)
 
2進[[デジタル]][[コンピュータ]]の内部固定長[[整数型]]や、[[固定小数点数]]負の値を表現するためや[[加算器]]で減算をためによく使われる。
 
与えられた2進数値(n[[ビット]])に対して、そのビット数より1桁多く、最上位ビットが1、残りがすべて0であるような数値(n=8なら 100000000 )から、元の数を引いた数が'''2の補数'''である。
頭の部分の1個以上の0を含む(正規化されていない)ある桁数の二進法で表現された数があるとき、その最上位ビット(MSB)よりひとつ上のビットが1で、残りが全て0であるような値(8ビットの整数であれば、100000000<sub>(二進)</sub> = 256)から、元の数を引いた数が'''2の補数'''である。MSBの重みが1であるような固定小数点表現の場合は特に「2」の補数となる。
 
== 例 ==
-36([[10]]の-36[[、8ビットで、2の補]]でどのように表されるかを例して示す
 
まず、8ビットで表されている数 00100100([[10進数]]: 36)の補数を求める。
二進法8ビットで、36は 00100100 である。
100000000 (8+1=9ビット)(256)
-) 00100100 (8ビット)(36)
-------------
11011100 (計算結果: 8ビット)(220)
(↑最上位ビット(この場合 9ビット目)は、0、1 のいかんにかかわらず無視する。)
 
したがって、'''2の補数'''は 11011100 であり、これが2進コンピュータ内部おけ -36 の表現は 11011100 (十進表現で220)である。
 
元の数(00100100)と求められた(11011100)の2つの数を足し合わせると、すべての桁 0 が立ちになり、負数が求められていることがわかる(桁上がりで生じる最上位桁に立つからの桁上がりの 1 は無視される)。
 
=== 別の求め方 ===
「1の補数に1を加える」という方法もある。算術的に考えると、(たとえばこの例の場合)「256-36」という計算を「(255-36)+1」に分解している。
「1の補数に1を加える方法」
 
まず
00100100の各ビットを反転させる(1の補数を求める)と、
11011011
次に1を加えると、
11011011
得られた値は、上記の値と同じことが分かる。
 
== 1の ==
二進法における、減基数すなわち2<sup>n</sup>-1による補数を'''1の補数'''と言う。1の補数は、全ての桁が1である値から、元の値を引けば求まるが、各ビットの1を0に、0を1に、と反転させても求められる。
全ての桁に1が立っている状態(11…1: nビット)から、
元の数を引いた後に求められる[[補数]]は[[1の補数]]と言う。
00100100(元の数)
11011011(1の補数)