コンピュータにおける数値表現:原碼・反碼・補碼の構造と演算原理

コンピュータの内部では、すべての数値がバイナリ(2進数)形式で保持されています。数値を扱う際、正負を区別するために「原碼(Sign-Magnitude)」「反碼(One's Complement)」「補碼(Two's Complement)」という3つの概念が用いられます。なぜこれほど複雑な表現方法が必要なのか、その本質はコンピュータのハードウェア構成と演算の効率化にあります。

1. ハードウェアの制約と加算器

フォン・ノイマン型アーキテクチャに基づき、計算機には「演算器」が備わっています。しかし、初期の設計や回路の簡略化の観点から、多くの演算器は加算(足し算)のみを行う「加算器」で構成され、減算(引き算)専用の回路は持たないのが一般的です。つまり、コンピュータにおける引き算は「正の数に負の数を加える」という加算処理によって実現されています。

この「負の数をどう表現し、加算器で正しく計算させるか」という課題を解決するために、符号ビットの概念と補正のための表現方法が生まれました。

2. 原碼(符号絶対値表示)

原碼は、人間にとって最も直感的な表現方法です。最上位ビット(MSB)を「符号ビット」とし、0であれば正、1であれば負を表します。残りのビットはその数値の絶対値を示します。

// 4ビット系での例
+3 の原碼: 0011 (符号0 + 絶対値3)
-3 の原碼: 1011 (符号1 + 絶対値3)

しかし、原碼には大きな欠点があります。正負の数を加算しようとすると、期待される結果が得られません。

// 原碼による 1 + (-1) の計算
  0001 ( +1 )
+ 1001 ( -1 )
-------
  1010 ( -2 として認識される )

このように、単純な加算器では符号ビットを考慮した正しい計算ができないため、次の段階として「反碼」が考案されました。

3. 反碼(1の補数)

反碼は、負の数を表現する際に、正の数のビットを反転させる手法です。正の数の反碼は原碼と同じですが、負の数の場合は符号ビットを維持したまま、他のビットをすべて反転させます。

// 4ビット系での例
+2 の反碼: 0010
-2 の原碼: 1010
-2 の反碼: 1101 (符号1を維持し、010を反転)

反碼を用いると、正負が逆の数値を加算した際に「0」に近い結果が得られるようになります。

// 反碼による 1 + (-1) の計算
  0001 ( +1 )
+ 1110 ( -1 )
-------
  1111 ( -0 )

計算結果は 1111(-0)となり、原碼よりは改善されました。しかし、いまだに「+0(0000)」と「-0(1111)」という2つのゼロが存在してしまい、論理的な不整合や無駄が生じます。

4. 補碼(2の補数)の理論的背景

補碼は現代のコンピュータで標準的に採用されている表現方法です。その定義は「負の数の補碼 = 反碼 + 1」とされることが多いですが、本質的には「合同式(モジュロ演算)」の概念に基づいています。

時計のメタファー

「10時から2時間戻すと8時になる(10 - 2 = 8)」という計算は、時計を10時間進めることと同じ結果を生みます(10 + 10 = 20 → 12で割った余りは8)。この場合、12を「法(モジュロ)」と呼び、-2と+10は12において「同余(合同)」であると言えます。

コンピュータのレジスタも同様にビット幅に制限があるため、溢れた桁(キャリー)は無視されます。4ビットのシステムであれば、法は $2^4 = 16$ となります。つまり、「2を引くこと」は「14(16-2)を足すこと」と等価になります。

// 4ビット系での減算 6 - 2 の補碼演算
+6 の補碼: 0110
-2 の補碼: 1110 (法16における-2の同余数 14 を2進数化したもの)

  0110 ( 6 )
+ 1110 ( 14 )
-------
 10100 ( 20 ) -> 4ビットのみ保持するため、上位の1は無視され「0100 (4)」となる

5. 補碼の算出アルゴリズム

実務的な補碼の求め方は以下の通りです。

  • 正の数: 原碼と同じ。
  • 負の数: 対応する正の数のビットを反転させ(反碼)、最後に1を加える。

もう一つの効率的な変換アルゴリズムとして、「右側から見て最初の1が現れるまではそのまま書き、その1よりも左側のビットをすべて反転させる(符号ビットは維持)」という方法もあります。

// 例: -4 を8ビット補碼にする
1. +4 の原碼: 0000 0100
2. 右から最初の1まで保持: ---- -100
3. それより左を反転: 1111 1100 (これが-4の補碼)

6. 補碼がもたらす利点

補碼を採用することで、以下のメリットが得られます。

  1. ゼロの単一化: 0000 0000 だけが 0 を表し、効率的な比較演算が可能になる。
  2. 加算器の共通化: 正の数も負の数も区別なく同じ加算回路で処理できる。
  3. 表現範囲の拡大: -0 が不要になった分、負の方向に1つ多くの数値を表現できる(8ビットなら -128 から 127 まで)。

このように、補碼は単なる数学的なトリックではなく、ハードウェアのリソースを最大限に活用し、数値計算を高速かつ正確に行うための洗練された設計思想の結果なのです。

タグ: 二進法 補数 低レイヤ コンピュータアーキテクチャ 演算器

9月1日 06:55 投稿