「2の補数」の版間の差分
後半をどうしたものか |
→負の整数の見方: わざわざ元に戻さなくてもよい |
||
38行目: | 38行目: | ||
11011100(2の補数) |
11011100(2の補数) |
||
== 負の |
== 負の数の値 == |
||
2の補数で表現された負の数の値を考えるには、二進法の各桁の重みについて、最上位ビット(MSB)のみ符号が反転したものとして計算すれば良い。 |
|||
コンピュータにおいては、2の補数と符号ビットを使った方法で負の整数を表すことが多い。こうした方法での負の整数の見方を例をあげて説明する。 |
|||
たとえば 1101<sub>2</sub> は、符号無しの二進法であれば、2<sup>3</sup> + 2<sup>2</sup> + 2<sup>0</sup> = 8 + 4 + 1 = 13 であるが、2の補数表現による負の数であるとした場合は、'''-2<sup>3</sup>''' + 2<sup>2</sup> + 2<sup>0</sup> = '''-8''' + 4 + 1 = -3 である。 |
|||
16ビットの整数型数値を考える。 |
|||
ここで、左端のビットを符号ビットとし、符号ビットが1なら負数とする。符号ビット以外の部分は、負の整数の場合、絶対値が2の補数で格納されていることとする。 |
|||
1111 1111 1111 0001<sub>2</sub> のような、上位側に1が並んだ数の場合も同様にして求めてもよいが、正の数の時に、上位側の0を無視するように、1が連続する間は無視し、最後の1の重みを負として、そこから下位の桁について同様に計算してもよい。 |
|||
1111 1111 1111 0001<sub>2</sub>は、どういう数値を表しているのだろうか? |
|||
:左端の符号ビットより符号はマイナスとわかる。次に絶対値を求めることを考えればいい。 |
|||
1111 1111 1111 0001<sub>2</sub>の場合、-16 + 1 で、-15 である。 |
|||
:絶対値部分は2の補数になっているので、2の補数を求める手順の逆をすればいい。まず、1を引くことにより1の補数にする。 |
|||
(-)111 1111 1111 0000<sub>2</sub> |
|||
:ビット反転し、1の補数を元の数値にする。 |
|||
(-)000 0000 0000 1111<sub>2</sub> |
|||
:これは10進の15。符号をつけて、結局、-15のこととわかる。 |
|||
== 十進法との対応 == |
== 十進法との対応 == |
2012年5月20日 (日) 01:16時点における版
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 |