コンピュータ内部では、あらゆる情報がビット列(2進数)で表現されます。今回は、整数について2進数でどのように表現されるのかを解説します。
正の整数の表現
正の整数は通常の2進数で表現されます。一般的に使用するビット数は8ビット、32ビットなどと固定されます。固定されたビットで上位ビットは0を埋めます。正の整数を表す表現方法を符号なし整数表現などと呼びます。
例として、8ビット列で表現できる整数は、0000 0000 〜 1111 1111 まで表現可能です。つまり、\(2^8 – 1 = 255\)なので、0〜255までの整数を表現することができます。
より一般的に表現すると、\(n\)ビット列で表現できる整数は、\([0, 2^n – 1]\)となります。
C言語のunsigned int/short/long 型は符号なし整数表現です。
負の整数
符号絶対値表現
コンピュータ内部では、0, 1のみしか使用できないので、いつも私たちが使用しているー(マイナス)記号を使うことができません。そのため、このマイナス自体も一つのビットとして割り当てることが考えらることができます。これを符号絶対値表現と呼びます。符号のためのビットを符号ビットと呼び、一般的には最上位ビットに符号を割り当てます。
4ビットの符号絶対値表現の例を示しておきます。この例からわかるように、符号絶対値表現は最大値は\7 = (2^3 -1\)、最小値は\-7 = (-(2^3-1)\)です。
\(n\)ビット列で表現できる整数は、\([2^n – 1, 2^n – 1]\)となります。
符号絶対値表現 | 10進数 |
1111 | -7 |
1110 | -6 |
1101 | -5 |
1100 | -4 |
1011 | -3 |
1010 | -2 |
1001 | -1 |
1000 | -0 |
0000 | +0 |
0001 | +1 |
0010 | +2 |
0011 | +3 |
0100 | +4 |
0101 | +5 |
0110 | +6 |
0111 | +7 |
符号絶対値表現では、ハードウェアの制約や+0, -0が2つあるという値とビット列の一意性などの理由から現在のコンピュータでは採用されていません。
2の補数表現
直感的に理解しやすいのは符号絶対値表現ですが、コンピュータでは2の補数表現と呼ばれる表現方法を採用しています。
補数とは
ここで、補数という言葉が出てきています。Wikipediaによると、以下のように説明されています。
補数(ほすう、(英: complement)または余数(よすう)とは、ある数 \(x\) との和が基準となる数 \(C\) に等しくなるような数である。すなわち、補数を \(x_c\) とすればこれは \(x + x_c = C\) を満たす。
C を b 進法の基数の冪 \(b^n\) とすればこれは、b進法で \(b_n = 100…00b\) と表せる。従ってこの場合、非負の整数 \(x\) に対する補数 \(x_c\) は \(x\) に足して \(n + 1\) 桁になる最小の整数と言える。
https://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0
まずは10進数として考えます。お釣りの計算をするときを考えるとわかりやすいです。
何か物を買ったとき、会計が253円だったとします。このとき自分は1000円持っているとします。このときお釣りはいくらですか?という問題を考えます。
この問題を暗算するときに、253円を1000円にするにはどうすればいいかを考えます。各桁で、9にするにはということを考えて、746と求めて、最後に+1をすると747と求めることができます。この747が補数です。つまり、補数とは基準となるような値にするためには、どれぐらい足せばいいかという値になります。基準となる値Cは10の冪乗である\(1000 = 10^3\)です。
この各桁を9にして、最後+1をするというのは補数を求めるための計算方法です。
まとめると、基準となる値を1000としたとき、10進数の253の10の補数は747ということになります。
2の補数の計算方法
同じように2進数で考えてみます。ここで、基準となる数を1000としてみます。基準となる数は、2の冪乗で設定します。
ここで、101の補数は、1000にするには各桁を1にするには010なので、+1するということなので、011と求められます。
2の補数では、数字が0, 1だけなので実際には各桁を1にするにはということは考えず、0, 1を反転するだけでよいです。
つまり、手順をまとめると、各桁をビット反転して、+1するという手順が2の補数を求める手順になります。
2の補数による負数の表現
2の補数による負数の表現では、負の数を2の補数で表現します。
4ビット列の+3(0110)の2の補数は、1001です。これを-3に対応させます。つまり、負数のビット列は、
- 数値を符号絶対値表現の正の数としてのビット列を求めます。
- 1で求めたビット列に対して、2の補数を求めます。
という手順で求められます。
4ビット列の場合、2の補数による負数の表現は以下のようになります。
符号絶対値表現 | 10進数 |
1000 | -8 |
1001 | -7 |
1010 | -6 |
1011 | -5 |
1100 | -4 |
1101 | -3 |
1110 | -2 |
1111 | -1 |
0000 | 0 |
0001 | +1 |
0010 | +2 |
0011 | +3 |
0100 | +4 |
0101 | +5 |
0110 | +6 |
0111 | +7 |
コメント