Subsections

3 負の整数の表現

コンピューター内部で負の整数を表現する方法はいろいろ考えられる.ここでは,2通りの 方法を示すが,符号ビットを用いる方法は現在では使われていないので,忘れてしまって も良い.諸君は,2の補数を用いる方法を理解しなくてはならない.

3.1 符号ビットを用いる方法(絶対値表示)

これまでは,正の整数を2進数あるいは16進数で表現することを学習した.次に,負の整 数を表す方法を学習する.通常の負の数は,

$\displaystyle (-0100110011101111)_2=(-4CEF)_{16}=(-19695)_{10}$    

と,マイナスの記号を書く.コンピューターでこれを表現するためには,符号ビットとし て,1ビット用意すれば良い.たとえば,先頭のビットが1の場合,それはマイナスを表す とする.例えば, $ (-19695)_{10}$ は,コンピューター内部で1100110011101111と 表すのである.

これは良い方法のように思える.しかし,10000000000000000000000000000000が同じゼロを表すことになる.明らかに不便である.また,詳し くは述べないが,これを使った負の数の演算のためのハードウェアー(CPU)が複雑になり, 現代ではこの方法は使われていない.実際には,次に述べる2の補数を使って,コンピュー ター内部では,負の数を表すのである.

3.2 2の補数

3.2.1 理論的な話

負の整数は,補数(complement)を使って,コンピューター内部では表現される.それを図 4に示すが,手順は,次の通りである.
  1. 絶対値を2進数のビットパターンで表現し,その反転を行う.
  2. 反転されたビットパターンに1を加算する.
このようにしてできたビットパターンをメモリーに記憶させ,それを負の数として取り扱 う.
図 4: 負の整数をメモリーに格納する方法
\includegraphics[keepaspectratio, scale=1.0]{figure/complement.eps}

2の補数表現のイメージは,図5の通りである.車の距離計に 似ている.

図 5: 距離計イメージ(2の補数表示)
\includegraphics[keepaspectratio, scale=1.0]{figure/image_complement.eps}

2の補数を使うメリットは,減算が加算器で可能なことである.それでは,なぜ,補数表 現だと,減算が加算器で可能なのだろうか?.減算の演算は,負の数の加算と同じである. したがって,図5のように負の数を表現すると,負の整数の加 算は正の整数の加算と同じと分かるであろう.したがって,加算器で減算が可能となる. 実際,正の数の減算を行うときは,ビットの反転と+1加算を実施して,加算器で計算する. イメージは,図5の通りであるが,もう少し,理論的に説明を おこなうとしよう.ある正の整数をxとする.その負の数,$ -x$ は補数表現では,

$\displaystyle [-x]=(FFFF-x+1)_{16}$ (2)

となる.左辺の$ [-x]$$ -x$ の意味である.$ [\quad]$ の意味は,括弧内の負の整数を計 算機内部の表現を表している.これは,私が作った表記なので,一般には用いられていな い.右辺の$ FFFF-x$ がビット反転になっている.ここでは,16ビットで整数を表現しよう としているので,$ FFFF$ から$ x$ を引いてビット反転させている.疑問に思う者は実際に 計算して見よ.それに1を加えて,補数の表現としている.つぎに,ある整数$ y$ を考えて, y-xを計算してみよう.

$\displaystyle [y-x]=(y+FFFF-x+1)_{16}$ (3)

$ FFFF-x+1$ は,あらかじめ計算されて,コンピューター内部のメモリーに格納されている ので,$ [y-x]$ は加算器で可能である.これは,あたりまえである.重要なことは,この結 果が,負の場合,2の補数表現になっており,正の場合,そのままの値になっていること である.

演算の結果,y-xが負になる場合を考えよう.すると式(3)は,

$\displaystyle [y-x]=\left\{FFFF-(x-y)+1)\right\}_{16}$ (4)

と変形できる.この場合,絶対値が $ (x-y)$ なので,絶対値のビット反転と+1加算となっ ていることが理解できる.つぎに,$ y-x$ が正になる場合を考えましょう.すると式(3)は,

$\displaystyle [y-x]$ $\displaystyle =(y-x+FFFF+1)_{16}$    
  $\displaystyle =(y-x+10000)_{16}$ (5)

となる. $ (10000)_{16}$ は計算機内部では,桁上がりを示す.16ビットの表示では無視される.し たがって,内部の表現は,正しく表せる.

[
l]コーヒーブレイク この方法で負の数を表すことは,1970年頃には常識となったようです.驚いたことに,負 の数をこの補数で表すアイディアは,パスカルが最初です.パスカルは,パスカリーヌと いう歯車式計算機を1642年頃に製作しています.そこの減算を加算器で行うために,補数 というものを考えたようです.

3.2.2 ビット反転と+1加算の意味

$ x$ を正の整数として,$ -x$ をコンピューターの内部で表現する場合,
  1. $ x$ をビット反転する.
  2. +1加算する.
の操作で得られたものその内部表現になる.式で表すと,

$\displaystyle [-x]=(FFFF-x+1)_{16}$ (6)

である.この操作の意味を調べてみよう.結論から言 うと,この操作は符号反転(-1乗算)の操作になっている.それを示すために,もう一度こ の操作を繰り返してみる.すると,

$\displaystyle \left\{FFFF-(FFFF-x+1)+1\right\}_{16}$ $\displaystyle =(x)_{16}$    
  $\displaystyle =[x]$ (7)

となる.このことから,この操作は,符号反転であることが理解できる.式 (6)は,$ x$ の符号反転を示しており,式(7) は$ -x$ の符号反転を示している.

式(6)は,-xのコンピューターの内部表現を表している.従って,元の xを求めるためには,その逆の操作

  1. 1減算(-1加算)する.
  2. ビット反転する.
をすればよく,式だと

$\displaystyle \left[FFFF-\left\{(FFFF-x+1)-1\right\}\right]$ $\displaystyle =(x)_{16}$    
  $\displaystyle =[x]$ (8)

となる.しかし,元の表現を得るためには,式(7)の演算でも良 いはずである.式(8)を変形すると,容易に式 (7)を導くことができる.これらのことから,以下の結論を導く ことができる.

3.2.3 2の補数表現と10進数の通常の表現の変換

これは,教科書に書いてあるとおり.
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
2005-11-17


no counter