負の数を扱う必要がないときは、符号なし整数を使います。
負の数を扱う必要のあるときは、符号付き整数を使います。負の数を2の補数で表現すると、結果として一番高い桁を調べることで正負の区別ができます。
2の補数での計算では最高位の桁も特別視せずに他の桁と同じように計算に使いますので、特に符号部として意識することはあまりありません。特に言葉によって計算に使わない部分だと勘違いしてはいけません。
符号付き整数は約半分を負の数に割り当てますから、扱える数の最大が符号なし整数の約半分になります。
符号なし整数 | 符号付き整数(2の補数) | |||
---|---|---|---|---|
bit | 最小値 | 最大値 | 最小値 | 最大値 |
4 | 0 | 15 | -8 | 7 |
8 | 0 | 255 | -128 | 127 |
16 | 0 | 65535 | -32768 | 32767 |
32 | 0 | 4294967295 | -2147483648 | 2147483647 |
64 | 0 | 18446744073709551615 | -9223372036854775808 | 9223372036854775807 |
2の補数表現のアイディアはコンピュータの計算効率を上げる上で大いに役に立ったすばらしいもので、その仕組みを学ぶことはとても価値のあることです。でも、2の補数を10進法に直すことはそれほど練習する必要はありません。
p22の例題では2の補数を10進法に直す練習がありますが、必要のない練習です。
もし、これをやるならば、 2の補数になっている数のさらに2の補数を求めると元の数に戻るという点を勉強すべきです。 ところが、この教科書ではこの点に注意を向けていません。
さらにまずいことに、解答では 2の補数を引き算で求めています。2の補数を使うと引き算も足し算で済ますことができるということを強調しながら、2の補数を引き算で求めるのはおかしい。
二進数では0,1を反転して1を加えると2の補数になるから、引き算も足し算で済ますことができると言えるわけです。
あえて「②負の整数 1110 を10進数で表わせ」の解答を書きなおすと
10進数 | 2進数(内部表現) |
---|---|
32767 | 0111 1111 1111 1111 |
32766 | ① |
┊ | ┊ |
2 | 0000 0000 0000 0010 |
1 | ② |
0 | 0000 0000 0000 0000 |
-1 | ③ |
-2 | 1111 1111 1111 1110 |
┊ | ┊ |
-32767 | ④ |
-32768 | 1000 0000 0000 0000 |
なお、上記は2の補数を使った符号付き整数の内部表現です。コンピュータでの整数の内部表現といいきるのは不正確です。
2の補数以外にも負の数を表現する方法があります。2の補数以外の負の数の表現(詳)にまとめておきました。