2010-08-25
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の補数を理解する」は終わりです。
- 3715 https://www.google.co.jp/
- 1079 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=10&ved=0CHcQFjAJ&url=http://d.hatena.ne.jp/simply-k/20100825/1282743815&ei=ONyfT6OGN4mOmQXfrPD4AQ&usg=AFQjCNE1MGya1zYDoOAbmh14Ijp3D_Vkag&sig2=Z6IwTvOn5ORRY8Q0HAuIuw
- 481 https://www.google.co.jp
- 449 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=2&ved=0CDQQFjAB&url=http://d.hatena.ne.jp/simply-k/20100825/1282743815&ei=1m1yT8OfMsvwmAWU6tnhDw&usg=AFQjCNE1MGya1zYDoOAbmh14Ijp3D_Vkag&sig2=bdgW208reEX6AihNTUwtDQ
- 423 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDIQFjAB&url=http://d.hatena.ne.jp/simply-k/20100825/1282743815&ei=VB1xT_3MCczmmAX02qHeDw&usg=AFQjCNE1MGya1zYDoOAbmh14Ijp3D_Vkag&sig2=a5Aze7pReFi0pl6iZpg7Mg
- 299 http://search.yahoo.co.jp/search?p=2の補数 表現可能範囲&sp=1&ei=UTF-8&meta=vc=&fr=top_ga1_sa&SpellState=
- 246 http://www.google.co.jp/url?sa=t&rct=j&q=2の補数 オーバーフロー&source=web&cd=11&ved=0CBsQFjAAOAo&url=http://d.hatena.ne.jp/simply-k/20100825/1282743815&ei=jkikTsuvK
- 209 http://www.google.co.jp/url?url=http://d.hatena.ne.jp/simply-k/20100825/1282743815&rct=j&frm=1&q=&esrc=s&sa=U&ei=joqOU7ytJ4-D8gWDjYKQDQ&ved=0CCgQFjAC&usg=AFQjCNH5Q-JA0pKajYO4PH2InstGrY9__w
- 179 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CDgQFjAC&url=http://d.hatena.ne.jp/simply-k/20100825/1282743815&ei=8_NrT6zADYPkrAfFjMWxAg&usg=AFQjCNE1MGya1zYDoOAbmh14Ijp3D_Vkag&sig2=LSu2qry2gXRWEyDgI50d3g
- 142 http://search.yahoo.co.jp/search?p=2の補数+オーバーフロー 判定&ei=UTF-8&fr=top_ga1_sa&x=wrt&meta=vc=