next up previous
Next: 4 浮動小数点数 (floating-point numbers) Up: 計算機における数の表現 Previous: 2 予備的な知識

3 整数

整数1は数値シミュレーションでは データとして使われることは滅多にないが、 簡単に解説しておく。

$m$ ビット・マシンでは、$m$ ビットのデータ (ワード) を標準の整数デー タを表現するために使うことが多い。$m$ ビットで $2^m$ 個のデータを表現 することが出来る ($m=16$ では $65536$ 個、$m=32$ では $4294967296$個)。 正の数だけあれば間に合うならば、ごく自然に $0,1,\cdots,2^m-1$ の数を対 応させることが出来る (実際 $b_{m-1}, b_{m-2},\cdots,b_1,b_0$$m$ ビットのデータとして、 $N = 2^{m-1} b_{m-1} + \cdots+2^k b_k+\cdots +
2^2b_2 + 2b_1 + b_0$ を対応させればよい)。C 言語で ``unsigned (符号無)'' を冠したデータ型はまさにこれである。

しかし大抵は負の数をも必要とする。素朴に考えると、1 ビット (例えば $b_{m-1}$) を符号を表すのに用いて、残りの $m-1$ ビットで絶対値を表すよう にする方法が思い浮かぶ。これは絶対値表示と呼ばれ、ある程度使わ れて来た。しかし現在ポピュラーな方法は補数表示と呼ばれる方法で ある。大抵は2 の補数表示であるが、1 の補数というものもある。

1の補数
$b_{m-1} b_{m-2} \cdots b_1 b_0$ というビットの列は 1 の補数表示で は次のように解釈される。
  • $b_{m-1} = 0$ ならば $N=b_0+2b_1+2^2b_2+\cdots+2^k
b_k+\cdots+2^{m-2}b_{m-2}$. ( $0\le N \le 2^{m-1}-1$ となる)
  • $b_{m-1} = 1$ ならば $N=-(c_0+2c_1+2^2c_2+...+2^k c_k+...+2^{m-2}c_{m-2})$. ただし $c_i = 1 - b_i$ とした。 ( $-2^{m-1}+1 \le N \le 0$ となる)
要するに $1$ の補数表示は本質的には絶対値表示とあまり変わらない。

例えば 8 ビットの場合、 $-1$ を表すには 00000001 の各桁を反転して 11111110 となる。


$2$ の補数表示では、 ビット列 $b_{m-1} b_{m-2} \cdots b_1 b_0$ の表す数は

\begin{displaymath}
N = b_0+2b_1+2^2b_2+\cdots+2^kb_k+\cdots+2^{m-2}b_{m-2}-2^{m-1}b_{m-1}
\end{displaymath}

とする。 $-2^{m-1}\le N \le 2^{m-1}-1$ となる。

$2$ の補数表示を用いる理由は、符号無しの場合の演算をする場合と回路が 共通化出来ること、複数のワードを用いて広い範囲の数を表現する多倍 長整数の演算の実現が簡単なことである。

演算をすることによって、結果が $m$ ビットの範囲に収まらなくなった場 合は、とにかく下位 $m$ ビットは残し、溢れ出たものは適当に処理する (こ とが多い)。加算、減算ならば溢れるのは 1 ビットなので、CPU に備わっ ているフラグに記憶する。乗算の場合は、溢れたものを捨ててしまうか、別の レジスターに収めることにする。加減算についてはデータを符号無しと考えて も、符号有りと考えても、結果の下位 $m$ ビットは同じものになることに注意。 10進数で説明すると

\begin{displaymath}
\begin{array}{rlllcrlllll}
& 9& 9& 9&\quad & &9&9&9&\quad &...
...&9&8& &-2\\
1\vert & 9& 9& 7& & 1\vert&9&9&7& &-3
\end{array}\end{displaymath}

$m$ ビット・マシンで 2 の補数表示を使うのは、加減乗算については、 $2^m$ を法とする剰余系を考えて、代表元として $-2^{m-1}, -2^{m-1}+1,
\cdots, -1, 0, 1, 2,\cdots, 2^{m-1}$ を取っているとして理解できる。

これに対して割算については、正数同士の場合はあまり問題がないが、負数 を含む演算の結果についてはあまり合理的な説明は出来ない。割り切れない場 合、剰余の符号をどう取るか、それに関連して商 (整数) をどうするか。 ($-7$ ÷ $2$ は ``$-3$ 余り $-1$'' なのか、 ``$-4$ 余り $1$'' なのか。 割る数×商+剰余が割られた数にならない場合もある(ひどい)。)


next up previous
Next: 4 浮動小数点数 (floating-point numbers) Up: 計算機における数の表現 Previous: 2 予備的な知識
桂田 祐史
2012-05-28