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

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Miki59697270 (会話 | 投稿記録)
編集の要約なし
SieBot (会話 | 投稿記録)
m ロボットによる 変更: ro:Complement față de doi
117行目: 117行目:
[[pl:Kod uzupełnień do dwóch]]
[[pl:Kod uzupełnień do dwóch]]
[[pt:Complemento para dois]]
[[pt:Complemento para dois]]
[[ro:Complement faţă de doi]]
[[ro:Complement față de doi]]
[[ru:Дополнительный код (представление числа)]]
[[ru:Дополнительный код (представление числа)]]
[[sl:Dvojiški komplement]]
[[sl:Dvojiški komplement]]

2010年6月2日 (水) 12:16時点における版

2の補数(にのほすう)は、通常は2進法における2の補数のことである。

2進デジタルコンピュータの内部で負の値を表すためによく使われる。 与えられた2進数値(nビット)に対して、そのビット数より1桁多く、最上位ビットが1、残りがすべて0であるような数値(n=8なら 100000000 )から、元の数を引いた数が2の補数である。計算後は、最上位ビット(n+1ビット目)は無視してよい。

8ビットで表されている数 00100100(10進数: 36) の補数を求める。

   100000000 (8+1=9ビット)
-)  00100100 (8ビット)
-------------
    11011100 (計算結果: 8ビット)
(↑最上位ビット(この場合 9ビット目)は、0、1 のいかんにかかわらず無視する。)

したがって、2の補数は 11011100 であり、これが2進コンピュータ内部における -36 の表現である。

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

別の求め方

「1の補数に1を加える方法」

まず

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

次に1を加えると、

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

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

補足

全ての桁に1が立っている状態(11…1: nビット)から、 元の数を引いた後に求められる補数1の補数と言う。

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

負の整数の見方

コンピュータにおいては、2の補数と符号ビットを使った方法で負の整数を表すことが多い。こうした方法での負の整数の見方を例をあげて説明する。

16ビットの整数型数値を考える。 ここで、左端のビットを符号ビットとし、符号ビットが1なら負数とする。符号ビット以外の部分は、負の整数の場合、絶対値が2の補数で格納されていることとする。

1111 1111 1111 00012は、どういう数値を表しているのだろうか?

左端の符号ビットより符号はマイナスとわかる。次に絶対値を求めることを考えればいい。

(-)111 1111 1111 00012

絶対値部分は2の補数になっているので、2の補数を求める手順の逆をすればいい。まず、1を引くことにより1の補数にする。

(-)111 1111 1111 00002

ビット反転し、1の補数を元の数値にする。

(-)000 0000 0000 11112

これは10進の15。符号をつけて、結局、-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

テクニック

ビットの立っている最下位ビットだけを残して残りを0にする方法

2の補数では、ビットの立っている最下位ビットだけを残して残りのビットを0にするには、C言語で x & -x により、可能である。例えば、14 & -14 は 2 となる。

   00001110	 14
&) 11110010	-14
------------
   00000010 	  2