乗算(multiplication)も,基本的には10進表現の乗算とまったく同様であり, 被乗数(multiplicand)を桁をずらして並べ,加算を行うことで,処理する。 図 6.7に,符号なし整数の例を示すが, 加算器が同時に二つの量の加算しかできないことから, 毎行ごとに加算を行うことが,通常の乗算と異なっている。 2進表現におけるメリットとして,乗数(multiplier)の各ビットには0と1しかないため, 0ならば0000(実際には,加算をスキップする)を, 1ならば被乗数そのものを置くだけで,各桁での乗算は不要である。
乗算の結果である積(product)の桁数を考察してみよう。 10進表現の積の場合には,4桁の整数同士の積は最大8桁になる。 2進表現の積の場合でも同様に,4bit同士の積は最大8bitになる。 標準のビット幅をしばしばワード(word)と呼ぶ 6.7。 したがって,1wordと1wordの積の結果は,最大,2wordになるので, 通常,2word分の領域を確保する。
乗算をコンピュータ内で行う際は,図 6.8のように,
結果の方を,シフタ(shifter)と呼ばれる回路で,右シフトさせながら加算していく。
また,乗数の方も右シフトさせ,シフト溢れ
が0か1かによって,
0のときには何もせず,1のときには乗数を加算する。
このため,結果となる累計
の右の空き部分に,乗数
をつなぎ,
一緒にシフトしている。
これは,ALUレジスタを無駄に使わないことと,
のシフトと
のシフトを同時に一つの命令でできることなどである。
見やすくするため,
部分には下線を付した。
シフト作業はまず,下位ワード(厳密には上位ワードのLSBも含む)を右シフトし,
溢れたデータを
にセットする。
次に上位ワード(厳密には
を含む)を右シフトする。
このように,必要に応じ,溢れビットを
として記憶できるような機能を持ったシフタを用意する必要がある。
加算は1word用の加算器で無理なく行うことができる。
加算は
=1のときのみ実行され,
=0のときには実行されない。
また,加算の結果,キャリーが生じたときには,
に保存しておく。
同じ原理で,符号あり整数の乗算も可能である。
ただし,正数と正数の積はこれでよいが,
いずれかに負数が入っていると,計算は複雑になり,次のような工夫が必要となる。
説明に当たり,負数
の補数表現
を
と記す。
についても同様である。
また,
積が負数
になる場合には8bitの補数である
を求めることになる。
今,元々の4bitの被乗数および乗数を
,
で表そう。
もし,
が正数であると
であるし,負数であると
である。
についても同様とする。
すると,上記の四つの結果は次の1行で表現することができる。
| (6.1) |
このように,乗算の基本的手順は変わらないが,
積の結果である2wordの上位ワードの方に,補正を加える必要がある。
この手法による
の計算を,
図 6.9に示す。
なお,同図右下の
の計算で,最終の結果の9bit目に1があるが,
これは256であり,8bitの範囲を越えるため,無視することができる。
その結果は期待通り42となる。
いずれも積の結果は2wordとしたが,電卓のように扱える最大桁数が決まっていて, 引き続く計算で1wordしか利用できない場合もある。 このような場合には,2wordの結果を出してから,上位ワードに0と1が混載していたら, オーバフローエラーとみなす。 上位ワードが0のみの場合は,1wordで表現できる正数であり, 1のみの場合は,1wordで表現できる負数であり, それ以外の場合は,オーバフローとなるからである。