電子計算機
第7回
|
電子計算機コンピューター内部の負の数の表現コンピューター内部の負の数の表現方法を示します.コンピューターでは全てビットで数を示します.したがって,マイナス記号「−」を使うことができません.そこで,現代のコンピューター内部では「2の補数」という表現方法が用いられます.本講義では,負の表現方法を学びます. 目次講義を始める前に本日の授業のテーマ本日の授業のテーマは,以下のとおりです.
本日の授業のゴールは、以下のとおり。
先週の復習
負の数の表現整数や小数の正の数の表現は非常に簡単でした。しかし、負の数の場合、事情が異なります。負の数の小数となると更にややこしいので、ここでは負の整数のみを取り扱うことにします。通常は、数の前に「–」の符号をつけて、負の数を表します。コンピューター内部には、マイナスの符号などありませんから、それに対応した何かが必要です。負の数を表す約束事を作る必要があります。いろいろな負の数を表す約束事(表現方法)が考えられます。数多くの負の表現方法がある中で、われわれが使うのは、
などを基準にして、実際に使うものを選択します。通常は、最期に紹介する2の補数表現を使いますが、ほかの表現方法も紹介しておきます。コンピューターの情報の単位は8ビットの場合が多いです。そのため、これ以降は8ビットで話を進めます。 絶対値表示絶対値表示とは、符号のためにビットを1つ設けて、あとは絶対値で表現する方法です。たとえば、図4のような表現です。人間にとって、この表現は分かりやすいですが、機械にとって良いか否かは別です。 1の補数表示1の補数表示とは、絶対値のビットを反転する方法です。したがって、第7ビットが符号を表すことになります。この方法の欠点は、00000000 と 11111111 がともにゼロを表すことになります。 2の補数表示2の補数の表現が、現在、計算機内部で普通に使われている方法です。これは、非常に重要です。図6に示しますが、手順は、
です。絶対に覚えてください。 要するに、先に示した1の補数表示に1を加えた表示方法です。 この表現方法のイメージを図7に示します。ここで重要なことは、第8ビットを無視すると、2進数が連続していることです。 この方法のメリットは、負の数の加算が加算器でできることです。これが可能だと、減算はその2の補数を計算して、加算器で出来ます。負の数の加算と正の数の減算は同じなので、負の数の加算が加算器で出来ることが重要です。 それでは、なぜ、2の補数表現だと、負の数の加算が加算器で可能なのでしょうか?。理論的に説明をしましょう。ある正の整数をxとしましょう。その負の数、-x は 2 の補数表現では、 \begin{align} [-x]=(FF-x+1)_{16}\label{eq:comp2_y-x} \end{align}となります。左辺の [-x] が -x の意味です。[ ] の意味は、括弧内の負の整数を計算機内部の表現を意味しています。これは、私が作った表記ですので、一般には用いられていません。右辺の FF-x がビット反転です。それに 1 を加えて、2の補数の表現としています。 つぎに、ある整数 y を考えて、y-x を計算してみましょう。 \begin{align} [y-x]=(y+FF-x+1)_{16} \end{align}FF-x+1 はあらかじめ計算されて、コンピューター内部のメモリーに格納されているので、[y-x]は加算器で可能です。 これはあたりまえです。重要なことは、この結果が負の場合、2の補数表現になっており、正の場合、そのままの値になっていることです。最初は、y-x が負になる場合を考えましょう。すると式\eqref{eq:comp2_y-x}は、 \begin{align} [y-x]=(FF-(x-y)+1)_{16} \end{align}と変形できます。この場合、絶対値が (x-y) なので、(1) 絶対値のビット反転,(2)+1加算となっています。つぎに、y-xが正になる場合を考えましょう。すると式\eqref{eq:comp2_y-x}は、 \begin{align} [y-x]&=(y-x+FF+1)_{16} \nonumber\\ &=(y-x+100)_{16} \end{align}となります。100は計算機内部では、桁上がりを示します。8ビットの表示では無視されます。したがって、内部の表現は、正しく表せます。 どの方法が有利か絶対値表示で負の数を減算する場合、減算器が必要です。場合によっては、比較器も必要かも知れません。1の補数表示と2の補数表示は似ていますが、0が2通りで表示する1の補数表示は良くないように思えます。2の補数表示は、減算をする場合、加算器が使えます。ただし、2の補数への変換が必要です。 減算の場合、
となります。じつは、減算器よりはビット操作の方がずっと簡単です。そのような理由から、2の補数表現が使われるようになったのです。負の数の加算は、圧倒的に2の補数表示の方が簡単です。このような理由から、回路構成の簡単な2の補数の表現が使われるようになりました。単に、補数といえば2の補数と考えてください。 この方法で負の数を表すことは、1970年頃には常識となったようです。コンピューターの発明から20~30年も要したことを考えると、これに到達するまでに、技術者はかなりの試行錯誤を行ったと思います。 驚いたことに、負の数をこの補数で表すアイディアは、パスカルが最初です。パスカルは、パスカリーヌという歯車式計算機を1642年に製作しています。減算、あるいは負の数の加算を加算器(歯車)で行うために、補数というものを考えたようです。 ビット反転と+1加算の意味正の整数 x として、-x を計算機の内部で表現する場合、
の操作を行いました。式で表すと, \begin{align} [-x]=(FF-x+1)_{16}\label{eq:-x内部表現} \end{align}でしたよね。ここでは、この操作の意味を調べます。結論から言うと、この操作は、符号反転の操作 (-1乗算) です。それでは、もう一回この操作を繰り返しましょう。すると \begin{align} (FF-(FF-x+1)+1)_{16}&=(x)_{16} \nonumber\\ &=[x]\label{eq:符号反転} \end{align}となります。このことから、この操作は、符号反転であることが分かります。式\eqref{eq:-x内部表現}は、xの符号反転を示しており、式\eqref{eq:符号反転}は-xの符号反転を示しています。 -x のコンピューター内部表現を求める式は、式\eqref{eq:-x内部表現}です。したがって、元の x を求めるためには、式\eqref{eq:-x内部表現}の反対の演算をすればよく、
となります。式で表すと、 \begin{align} (FF-(FF-x+1-1))_{16}&=(x)_{16} \nonumber\\ &=[x]\label{eq:再び符号反転} \end{align}です。しかし、元の表現を得るためには、式\eqref{eq:符号反転}の演算でも良いはずです。式\eqref{eq:再び符号反転}を変形すると式\eqref{eq:符号反転}が容易に導くことが出来ます。これらのことから、以下の結論を導くことが出来ます。
練習問題 (2の補数)8ビットで、以下の計算を実施してみよう。
|