2の補数を理解する (2)

前回の続きです。
前回: id:simply-k:20100824:1282743815

2の補数による符号付き整数の表現(4ビット)

前回の記事で載せた表を、再度、載せておきます。この表を見ながら、この先の説明を読んでください。

2進表現 10進表現
(符号無し)
10進表現
(符号付き)
1111 15 -1
1110 14 -2
1101 13 -3
1100 12 -4
1011 11 -5
1010 10 -6
1001 9 -7
1000 8 -8
0111 7 7
0110 6 6
0101 5 5
0100 4 4
0011 3 3
0010 2 2
0001 1 1
0000 0 0

2の補数を使った加算

特徴

2の補数を使った加算には、次のような特徴があります。

  • 加算によって最上位ビットからの繰り上がりが発生した場合、その繰り上がりは無視する。
  • 加算した結果も、2の補数によって表現されている。
  • 加算した結果が2の補数で表現可能な範囲に収まらない場合、オーバーフローが発生する。(正しく計算されない)

加算の例 (オーバーフローなし)

これから説明する加算の例では、それぞれの整数は4ビットで表現されるものとします。また、10進数と2進数の変換を行っているのは、説明をわかりやすくするためです。コンピュータ内部で行われる計算は、全て2進数で行われます。

「正の数+正の数」の例

「正の数+正の数」を計算する例です。

4 + 3 (10進) = 0100 + 0011 (2進) = 0111 (2進) = 7 (10進)

このケースについては、特に説明はいらないと思います。

「正の数+負の数」の例 (結果が正の数)

「正の数+負の数」を計算し、結果が正の数になる例です。

5 + (-2) (10進) = 0101 + 1110 (2進) = 0011 (2進) = 3 (10進)

「0101 + 1110」は、繰り上がりを考慮すると10011ですが、4ビットの範囲からはみ出た1は無視するので、計算結果は0011となります。0011の最上位ビットは0なので、計算結果が負の数で無いことがわかります。このため、単純に0011を10進数に変換すると、計算結果の10進表現は3となります。

「正の数+負の数」の例 (結果が負の数)

「正の数+負の数」を計算し、結果が負の数になる例です。

4 + (-6) (10進) = 0100 + 1010 (2進) = 1110 (2進) = -2 (10進)

「0100 + 1010」の計算結果は1110となりますが、最上位ビットが1であるため、負の数であることがわかります。1110の2の補数は0010であり、0010は10進数では2であるため、計算結果の10進表現は-2となります。

「負の数+負の数」の例

「負の数+負の数」を計算する例です。

(-1) + (-5) (10進) = 1111 + 1011 (2進) = 1010 (2進) = -6 (10進)

「1111 + 1011」は、繰り上がりを考慮すると11010ですが、4ビットの範囲からはみ出た1は無視するので、計算結果は1010となります。1010の最上位ビットは1なので、計算結果が負の数であることがわかります。1010の2の補数は0110であり、0110は10進数では6であるため、計算結果の10進表現は-6となります。

加算の例 (オーバーフローあり)

「正の数+正の数」または「負の数+負の数」の場合、計算結果が2の補数の表現範囲を超える場合があります。ここから先は、そのような例を示します。2の補数を使った符号付き4ビット整数で表現可能な範囲が-8〜7であることを念頭に置いて、この先の例を読んでください。

「正の数+正の数」の例

「正の数+負の数」を計算し、オーバーフローが発生する例です。

5 + 4 (10進) = 0101 + 0100 (2進) = 1001 (2進) = -7 (10進)  ※正しくない

「5 + 4」の計算結果である9は、-8〜7の範囲に収まりません。このため、「5 + 4」は、正しく計算できません。

「負の数+負の数」の例

「負の数+負の数」を計算し、オーバーフローが発生する例です。

(-7) + (-3) (10進) = 1001 + 1101 (2進) = 0110 (2進) = 6 (10進)  ※正しくない

「(-7) + (-3)」の計算結果である-10は、-8〜7の範囲に収まりません。このため、「(-7) + (-3)」は、正しく計算できません。

オーバーフロー発生の判定

次の条件のどちらかに該当する場合、オーバーフローが発生しています。

  • 最上位ビットが0の数どうしを加算した結果、最上位ビットが1になった
    (つまり、非負の数どうしの加算結果が負の数になった)
  • 最上位ビットが1の数どうしを加算した結果、最上位ビットが0になった
    (つまり、負の数どうしの加算結果が非負の数になった)

上記以外のケースでは、正しい計算結果が得られます。

2の補数を使うメリット

符号付き整数を表現する際に2の補数を使うと、「加算と同じ仕組みで減算を実現できる」というメリットがあります。つまり、CPUなどの内部で減算用の回路が不要になります。


これで、「2の補数を理解する」は終わりです。
前回: id:simply-k:20100824:1282743815