Subsections
コンピューター内部で負の整数を表現する方法はいろいろ考えられる.ここでは,2通りの
方法を示すが,符号ビットを用いる方法は現在では使われていないので,忘れてしまって
も良い.諸君は,2の補数を用いる方法を理解しなくてはならない.
これまでは,正の整数を2進数あるいは16進数で表現することを学習した.次に,負の整
数を表す方法を学習する.通常の負の数は,
と,マイナスの記号を書く.コンピューターでこれを表現するためには,符号ビットとし
て,1ビット用意すれば良い.たとえば,先頭のビットが1の場合,それはマイナスを表す
とする.例えば,

は,コンピューター内部で
1100110011101111と
表すのである.
これは良い方法のように思える.しかし,1000000000000000と
0000000000000000が同じゼロを表すことになる.明らかに不便である.また,詳し
くは述べないが,これを使った負の数の演算のためのハードウェアー(CPU)が複雑になり,
現代ではこの方法は使われていない.実際には,次に述べる2の補数を使って,コンピュー
ター内部では,負の数を表すのである.
負の整数は,補数(complement)を使って,コンピューター内部では表現される.それを図
4に示すが,手順は,次の通りである.
- 絶対値を2進数のビットパターンで表現し,その反転を行う.
- 反転されたビットパターンに1を加算する.
このようにしてできたビットパターンをメモリーに記憶させ,それを負の数として取り扱
う.
2の補数表現のイメージは,図5の通りである.車の距離計に
似ている.
2の補数を使うメリットは,減算が加算器で可能なことである.それでは,なぜ,補数表
現だと,減算が加算器で可能なのだろうか?.減算の演算は,負の数の加算と同じである.
したがって,図5のように負の数を表現すると,負の整数の加
算は正の整数の加算と同じと分かるであろう.したがって,加算器で減算が可能となる.
実際,正の数の減算を行うときは,ビットの反転と+1加算を実施して,加算器で計算する.
イメージは,図5の通りであるが,もう少し,理論的に説明を
おこなうとしよう.ある正の整数をxとする.その負の数,
は補数表現では,
![$\displaystyle [-x]=(FFFF-x+1)_{16}$](img24.png) |
(2) |
となる.左辺の
![$ [-x]$](img25.png)
が

の意味である.
![$ [\quad]$](img26.png)
の意味は,括弧内の負の整数を計
算機内部の表現を表している.これは,私が作った表記なので,一般には用いられていな
い.右辺の

がビット反転になっている.ここでは,16ビットで整数を表現しよう
としているので,

から

を引いてビット反転させている.疑問に思う者は実際に
計算して見よ.それに1を加えて,補数の表現としている.つぎに,ある整数

を考えて,
y-xを計算してみよう.

は,あらかじめ計算されて,コンピューター内部のメモリーに格納されている
ので,
![$ [y-x]$](img32.png)
は加算器で可能である.これは,あたりまえである.重要なことは,この結
果が,負の場合,2の補数表現になっており,正の場合,そのままの値になっていること
である.
演算の結果,y-xが負になる場合を考えよう.すると式(3)は,
![$\displaystyle [y-x]=\left\{FFFF-(x-y)+1)\right\}_{16}$](img33.png) |
(4) |
と変形できる.この場合,絶対値が

なので,絶対値のビット反転と+1加算となっ
ていることが理解できる.つぎに,

が正になる場合を考えましょう.すると式(
3)は,
となる.

は計算機内部では,桁上がりを示す.16ビットの表示では無視される.し
たがって,内部の表現は,正しく表せる.
[ |
---|
l]コーヒーブレイク
この方法で負の数を表すことは,1970年頃には常識となったようです.驚いたことに,負
の数をこの補数で表すアイディアは,パスカルが最初です.パスカルは,パスカリーヌと
いう歯車式計算機を1642年頃に製作しています.そこの減算を加算器で行うために,補数
というものを考えたようです.
|

を正の整数として,

をコンピューターの内部で表現する場合,
をビット反転する.
- +1加算する.
の操作で得られたものその内部表現になる.式で表すと,
である.この操作の意味を調べてみよう.結論から言
うと,この操作は符号反転(-1乗算)の操作になっている.それを示すために,もう一度こ
の操作を繰り返してみる.すると,
となる.このことから,この操作は,符号反転であることが理解できる.式
(
6)は,

の符号反転を示しており,式(
7)
は

の符号反転を示している.
式(6)は,-xのコンピューターの内部表現を表している.従って,元の
xを求めるためには,その逆の操作
- 1減算(-1加算)する.
- ビット反転する.
をすればよく,式だと
となる.しかし,元の表現を得るためには,式(
7)の演算でも良
いはずである.式(
8)を変形すると,容易に式
(
7)を導くことができる.これらのことから,以下の結論を導く
ことができる.
- ビット反転と+1加算の操作は,整数のコンピューターの内部での表現の符号反転で
ある.
- この符号反転の反対の操作である1減算とビット反転の操作は,ビット反転と1加
算と同じ操作である.
これは,教科書に書いてあるとおり.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
2005-11-17