負の数の表現

2進表記で負の数を表すのは、十進表記に合わせれば当然マイナスの符号を付けるだけ。

-1,  -11,  -1010

これをコンピュータ内部でどう表すかは何通りかのやり方があります。

整数の計算をする時には、ここで説明する「2の補数」をとるのが便利。

限界を超えた足し算

負の数を考える前に正の数に1を加えていって計算機の限界を超える場合を考えてみる。

2進4桁の計算機に0から始めて1を足していく。

2進表現 10進表現
00000
00011
00102
00113
01004
01015
01106
01117
10008
10019
101010
101111
110012
110113
111014
111115

1111に1を足すと10000になるが、4桁しかない計算機だとこれを表現できない。

4桁目からでるキャリーを検出したらエラーとして処理する設計もあり得るが、もし無視をすれば次のように続くことになる。

2進表現 10進表現
......
111115
00000
00011
00102
......

4桁しかなくて、キャリーを無視すれば0に戻って1,2,3,...と繰り返すことになる。当然(無視した)16を足せば正しい値になる。

2の補数による負の整数の表現

1を足して限界をこえると0に戻った。これを逆に考えると1を減じていくと0の次は-1ということになる








2進表現 10進表現






10進表現
......
111014-2
111115-1
000000
000111
001022
........

しかし、このままでは1111が15でもあり-1でもありで不都合なので最高位のビットが1なら負の数とする。つまり、

2の補数を使った符号付き整数
2進表現 10進表現
01117
01106
01015
01004
00113
00102
00011
00000
1111-1
1110-2
1101-3
1100-4
1011-5
1010-6
1001-7
1000-8

と決めるのが、2の補数による負の整数の表現である。

もちろん、これは4ビットの場合で、8ビットならば

2進表現 10進表現
01111111127
......
0000111115
......
000001013
000000102
000000011
000000000
11111111-1
11111110-2
11111101-3
11111100-4
......
10000000-128

となる。

この決め方に加えて、上で行った桁数の限界を超えたキャリーは無視するという方法をとると、正の数+負の数もそのまま計算してしまえばよい。

試してみる

2 + 4
6 + (-3)
-4 + 4
-3 + (-5)

他の方法

負の数を表す方法のいろいろ。

補数による表現はコンピュータでの計算に便利なようになっている。「符号をつけるだけ」は最上位ビットが1ならば負の数と決め、値は最上位ビットを除いて絶対値で表現する。エクセス7はすべての数に7を足して符号無しの表現をする。7は正の範囲と負の範囲が同じになるようにしたもので、8ビットならば15などとする。

4ビットの場合
2進表現 符号無し 2の補数 1の補数 符号を付
けるだけ
エクセス7
00000000-7
00011111-6
00102222-5
00113333-4
01004444-3
01015555-2
01106666-1
011177770
10008-8-7-01
10019-7-6-12
101010-6-5-23
101111-5-4-34
110012-4-3-45
110113-3-2-56
111014-2-1-67
111115-1-0-78
聖愛中学高等学校
http://www.seiai.ed.jp/
Jun. 2009