コンピュータでの整数の表現

符号なし整数と符号付き整数

負の数を扱う必要がないときは、符号なし整数を使います。

負の数を扱う必要のあるときは、符号付き整数を使います。負の数を2の補数で表現すると、結果として一番高い桁を調べることで正負の区別ができます。

2の補数での計算では最高位の桁も特別視せずに他の桁と同じように計算に使いますので、特に符号部として意識することはあまりありません。特に言葉によって計算に使わない部分だと勘違いしてはいけません。

符号付き整数は約半分を負の数に割り当てますから、扱える数の最大が符号なし整数の約半分になります。

符号なし整数 符号付き整数(2の補数)
bit 最小値 最大値 最小値 最大値
4015-87
80255-128127
16065535-3276832767
3204294967295-21474836482147483647
64018446744073709551615-92233720368547758089223372036854775807

2の補数を10進に直す必要はほとんどない

2の補数表現のアイディアはコンピュータの計算効率を上げる上で大いに役に立ったすばらしいもので、その仕組みを学ぶことはとても価値のあることです。でも、2の補数を10進法に直すことはそれほど練習する必要はありません。

p22の例題では2の補数を10進法に直す練習がありますが、必要のない練習です。

もし、これをやるならば、 2の補数になっている数のさらに2の補数を求めると元の数に戻るという点を勉強すべきです。 ところが、この教科書ではこの点に注意を向けていません。

さらにまずいことに、解答では 2の補数を引き算で求めています。2の補数を使うと引き算も足し算で済ますことができるということを強調しながら、2の補数を引き算で求めるのはおかしい。

二進数では0,1を反転して1を加えると2の補数になるから、引き算も足し算で済ますことができると言えるわけです。

あえて「②負の整数 1110 を10進数で表わせ」の解答を書きなおすと

  1. 最高位のビットが1なので2の補数になっている。
  2. そこでさらに2の補数を求め元の数に戻す
  3. 2の補数にするために、1110の各ビットを反転し、0001を得る。1を加えて0010になる。
  4. 0010を10進数にすると2である。マイナスの数なので、答えは-2である。

確認問題

10進数 2進数(内部表現)
327670111 1111 1111 1111
32766
20000 0000 0000 0010
1
00000 0000 0000 0000
-1
-21111 1111 1111 1110
-32767
-327681000 0000 0000 0000

なお、上記は2の補数を使った符号付き整数の内部表現です。コンピュータでの整数の内部表現といいきるのは不正確です。

2の補数以外にも負の数を表現する方法があります。2の補数以外の負の数の表現(詳)にまとめておきました。