情報処理技術編 - 負の数の表現 | Programming Place Plus

トップページ情報処理技術編

この章の概要 🔗

この章の概要です。


負の整数 🔗

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の補数は、以下の手順で簡単に求められます

  1. 各ビットを反転する (0 は 1 に、1 は 0 に)
  2. +1 する (桁が溢れた部分は無視する)

「0111」を例に取ります。各ビットを反転すると「1000」です。ここに +1 すると「1001」が得られます。先ほど、普通に計算した結果と一致しました。

【上級】ちなみに、手順1で止めると 1の補数になっています。1の補数表現を使う世界では、「0111」が +7 を、「1000」が -7 を表します。

【上級】符号と絶対値による表現を使う世界では、最上位のビットを符号の表現に使い、残りのビットで絶対値を表現します。符号のビットが 0 ならば正、1 ならば負とします。この表現では、「0111」が +7、「1111」が -7 を表しています。

逆の操作をすれば、負の整数を正の整数に変換できます。つまり、次の手順を踏みます。

  1. -1 する
  2. 各ビットを反転する (0 は 1 に、1 は 0 に)

この方法を知っておけば、最上位ビットが 1 になっている負の 2進整数が与えられたとき、それが 10進数でいくつのことなのか分かります。たとえば「1100」で試してみます。最上位ビットを見れば負数なのは明らかですが、具体的な数は単純には分かりません。

  1. -1 して「1001」
  2. 各ビットを反転して「0110」

「0110」は +6 のことなので、元の数「1100」は -6 のことだったと分かります。

2の補数表現では、負の数の方が、正の数よりも表現できる値が1つ多いという特徴があります。

たとえば、4桁の 2進数において表現できる最大の正の数は「0111」です。正の数であるためには、最上位ビットは 0 でなければならず、残りのビットがすべて 1 のときが最大値です。

一方、最小の負の数は「1000」です。2の補数を求める過程で各ビットを反転するので、最上位ビット以外には 0 が並んでいる状態が最小です。

ここで「1000」は -8 のことなのですが、+8 は表現できません。負の整数を正の整数に変換する手順を実行してみると、以下のようになります。

  1. -1 して「0111」
  2. 各ビットを反転して「1000」

このように「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で書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る