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)」は、正しく計算できません。
2の補数を使うメリット
符号付き整数を表現する際に2の補数を使うと、「加算と同じ仕組みで減算を実現できる」というメリットがあります。つまり、CPUなどの内部で減算用の回路が不要になります。
これで、「2の補数を理解する」は終わりです。
前回: id:simply-k:20100824:1282743815