結局2の補数表現って…

何者なんだと基本情報〜の参考書を読んでて思ったので、自分なりに考えて捕らえたイメージを覚え書き。もちろん参考書は先日書いたやつ[id:TO-SHI-O:20070228:1172679049]。*1

まず、計算機上の2進数(符号など無く、0と1しか使えない)で負の数を表現するためにこの話があると。ちなみに、2進数のケタはビットとも呼ぶ。

  • 2進数 … 各ケタ2で繰り上がるよう表現された数
  • ある数の補数 … 基数(この場合最大数、全ビット1)からある数を引いたもの

ここまでが前提のお話と。

例えば8ビットの2進数は256通りの数を表せるが、それらに、絶対値が等しい正負の二値を写像で対応付けして割り当てる。この時、0を含む正側(0〜127)の2進数表記が本来の数と一致するのが大前提。写像の決め方により補数は次のものが考えられている。

  • 1の補数 … 「全ビット1から引く」=「各ビットを反転」
  • 2の補数 … 「各ビットを反転して1足す」=「1引いて各ビットを反転」

この他に先頭ビットを符号(0なら+、1なら−)に見立てて負の数の表現するものがあって、この表現と1の補数表現には「0が2通りに表される」という共通のデメリットがある。

  • 符号 … 全ビット0先頭ビット1他0の2つが0
  • 1の補数 … 全ビット0全ビット1の2つが0

一方、2の補数は像を写しても自分自身になる数が2つ存在する。それは、全ビット0の数(そもそもの0)と、先頭ビット1他0の数(未定義)。その他は全て1の補数表現のごとく正負が対となるようバラける。

8ビットの2進数を考えたとき、1の補数が(1,-1)〜(127,-127)のセット2個の0で256個割り当て完了なのに対し、2の補数は(1,-1)〜(127,-127)のセット1個の0で255個、あと未定義の数が1つある。ここに-128を割り当てることにすると(nbitなら-(2のn-1乗)を割り当てる)。

というわけで、2の補数表現というのは、0の補数が0なのはいいとして、-128の補数が-128というちょっと変な特徴がある*2

文字で書くと長いけど図ならこんな感じ。

     2の補数表現

*1:とっても分かりやすい^^

*2:僕の場合この-128の補数への言及がないと何か腑に落ちない感じがしてしまう