この章の概要です。
2進数で負の整数を表現するには、3つのよく知られた方法があります。
ここでは、圧倒的によく使われている 2の補数表現という手法を取り上げます。
2の補数とは、n桁の 2進数で表される整数 x があるとき、「x + y = 2n」を満たす y のことです。
2の補数表現では、正の整数 x の符号を変えた -x を表現するために、x の 2の補数を使う手法です。なお、2の補数表現では、最上位のビットが 0 のときは正の数であり、1 のときは負の数であるものとします。
たとえば、「0111」という 4桁の 2進数があるとします。最上位が 0 なので、これは正の数であり、+7 のことです。「0111」の 2の補数は、先ほどの式のとおり「0111 + y = 10000」となる y のことですが、この y の値を -7 を表現するものして扱います。
計算してみると「10000 - 0111」なので、y は「1001」であることが分かります。よって「0111」が +7、「1001」が -7 です。
このように普通に計算しても良いのですが、2の補数は、以下の手順で簡単に求められます。
「0111」を例に取ります。各ビットを反転すると「1000」です。ここに +1 すると「1001」が得られます。先ほど、普通に計算した結果と一致しました。
【上級】ちなみに、手順1で止めると 1の補数になっています。1の補数表現を使う世界では、「0111」が +7 を、「1000」が -7 を表します。
【上級】符号と絶対値による表現を使う世界では、最上位のビットを符号の表現に使い、残りのビットで絶対値を表現します。符号のビットが 0 ならば正、1 ならば負とします。この表現では、「0111」が +7、「1111」が -7 を表しています。
逆の操作をすれば、負の整数を正の整数に変換できます。つまり、次の手順を踏みます。
この方法を知っておけば、最上位ビットが 1 になっている負の 2進整数が与えられたとき、それが 10進数でいくつのことなのか分かります。たとえば「1100」で試してみます。最上位ビットを見れば負数なのは明らかですが、具体的な数は単純には分かりません。
「0110」は +6 のことなので、元の数「1100」は -6 のことだったと分かります。
2の補数表現では、負の数の方が、正の数よりも表現できる値が1つ多いという特徴があります。
たとえば、4桁の 2進数において表現できる最大の正の数は「0111」です。正の数であるためには、最上位ビットは 0 でなければならず、残りのビットがすべて 1 のときが最大値です。
一方、最小の負の数は「1000」です。2の補数を求める過程で各ビットを反転するので、最上位ビット以外には 0 が並んでいる状態が最小です。
ここで「1000」は -8 のことなのですが、+8 は表現できません。負の整数を正の整数に変換する手順を実行してみると、以下のようになります。
このように「1000」は「1000」に戻ってしまいます。最上位ビットが 1 であるため、これは負の数を表しており、-8 に対応する正の数(+8) は表現できないということが分かります。
したがって、2の補数表現を使う 4桁の 2進数の世界で表現できる値の範囲は、-8~+7 です。これは桁数が変わっても同じで、つねに負数の側の表現力が 1つ分多くなります。
【上級】1の補数表現や、符号と絶対値による表現では、正と負とで表現範囲に違いはありません。その代わり、0 を表現する方法が2通りあるという別の特徴があります(原理上、+0 と -0 があり得る)。
Amazon.co.jp へのリンクはアフィリエイトリンクです。
リンク先で商品を購入されると、Programming Place
管理者に紹介料が支払われます。
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |