まず、2の補数は「コンピュータでの負数を表現するために使用されている」ことを理解しておきましょう。コンピュータは有限の数しか扱うことができないので、限られたビットで正と負を表現しなければなりません。例えば、4ビットの場合で正と負を表すと、以下の表のように-8~+7まで表すことができます。
| +7 |
0111 |
| +6 |
0110 |
| +5 |
0101 |
| +4 |
0100 |
| +3 |
0011 |
| +2 |
0010 |
| +1 |
0001 |
| 0 |
0000 |
| -1 |
1111 |
| -2 |
1110 |
| -3 |
1101 |
| -4 |
1100 |
| -5 |
1011 |
| -6 |
1010 |
| -7 |
1001 |
| -8 |
1000 |
4ビットでの2の補数表現
4ビットでも正と負を考えなれば(絶対値)、0~15まで表現することができます。4ビットの2の補数では「1001」は「-7」ですが、絶対値では「9」になります。したがって、正と負の両方を表現するのか正だけ表現するのかでビット意味が違ってきます。試験では「2の補数」という言葉が出てきたら正と負の両方を表現すると考えてください。
| 15 |
1111 |
| 14 |
1110 |
| 13 |
1101 |
| 12 |
1100 |
| 11 |
1011 |
| 10 |
1010 |
| 9 |
1001 |
| 8 |
1000 |
| 7 |
0111 |
| 6 |
0110 |
| 5 |
0101 |
| 4 |
0100 |
| 3 |
0011 |
| 2 |
0010 |
| 1 |
0001 |
| 0 |
0000 |
4ビットの絶対値での表現(符号なし)
C言語ではshort,int,longで変数を宣言すると正と負の両方を表すためにビットを使用しています。short型は2バイト(16ビット)であり、-32768~32767まで扱うことができます。また、unsigned shortと宣言すると負の扱いができません。したがって、2バイトで0~65535まで扱うことになります。