2の補数計算機とは?
2の補数(two's complement)は、コンピュータが符号付き整数を固定ビット数で表現する際の標準的な方式です。この計算機では、10進数とnビットのレジスタ幅を入力すると、その値が2の補数のビットパターンとしてどのように格納されるか、そのビット列が符号なし整数としていくつを表すか、そして符号付き整数としてどう解釈されるかを表示します。正の数・負の数のどちらにも対応しています。
使い方
エンコードしたい10進数の値と、ビット数(一般的には8・16・32)を入力します。計算機は剰余演算(mod)を使って値をnビットのレジスタに収め、2進数表現を表示したうえで符号付きの解釈を導きます。負の値を入力した場合は、自動的に2の補数形式で格納されます。
計算式の解説
値 \(x\) を \(n\) ビットに格納するには、格納される(符号なし)パターンを次の式で求めます。
$$\text{stored} = \left(\left(x \bmod 2^{n}\right) + 2^{n}\right) \bmod 2^{n}$$格納値の2の補数(否定)は次の式です。
$$\text{twos} = \left(2^{n} - \text{stored}\right) \bmod 2^{n}$$nビットのパターンを符号付きとして復号するには、パターンが \(2^{n-1}\) 以上であれば値は \(\text{pattern} - 2^{n}\)(負の数)、そうでなければパターンそのものが値となります。
具体例
-5 を8ビットでエンコードしてみましょう。ここで \(2^{8} = 256\) なので、
$$\text{stored} = \left(\left(-5 \bmod 256\right) + 256\right) \bmod 256 = 251$$2進数では \(251 = 11111011\) です。251 を復号すると、\(251 \ge 2^{7}\)(128)なので符号付きの値は \(251 - 256 = -5\)。さらに 251 の2の補数は \(\left(256 - 251\right) \bmod 256 = 5\) となり、絶対値と一致します。
よくある質問
負の数はなぜ大きな2進パターンに見えるの? 先頭のビットが 1 になるためです。nビットの符号付き演算では先頭の 1 が負の数を表すので、11111011 は 251 ではなく -5 を意味します。
nビットで表せる範囲は? 符号付きの値は \(-2^{n-1}\) から \(2^{n-1} - 1\) までです。8ビットなら -128 から 127 になります。
大きすぎる数を入れたら? レジスタに収まらない値は、剰余演算によって折り返し(オーバーフロー)が起こります。これは実際のハードウェアの動作とまったく同じです。