進数と補数

chotdekiru/cs-binary-3-complementデータの表し方 - 0と1の世界14コンピュータサイエンス

上から下へ、全 14 枚そのまま並べています。

発表モードで開く

データの表し方 - 0と1の世界

進数と補数

〜負の数の表し方〜 0と1だけでマイナスを表すしくみ

1
1
データの表し方 - 0と1の世界

今日のゴール

このレッスンを終えると、こう言えるようになります。

  • 0と1だけでマイナスも表せる
  • 「2の補数」という仕組みがある
  • 引き算が足し算に変わる便利さ
2
2
データの表し方 - 0と1の世界

復習 2進数のおさらい

コンピュータは数を0と1の並びで表していました。

  • 1桁が増えるごとに重みが2倍
  • 右から1・2・4・8と数える
  • 例 1011 は 8+2+1 で 11
3
3
データの表し方 - 0と1の世界

問題 マイナスはどう表す?

0と1しか使えないのに、マイナスの数はどう書けばいいのでしょう。

  • 紙の上なら「−5」と書ける
  • でも使えるのは0と1だけ
  • マイナス記号も0と1で表すしかない
4
4
データの表し方 - 0と1の世界

単純な方法とその欠点

先頭1桁を符号に使う方法は、実はうまくいきません。

先頭で符号を表す案

やり方
結果
先頭が0ならプラス
+5 と表せる
先頭が1ならマイナス
−5 と表せる
でも0が2種類できる
+0 と −0 が別物に

計算でつまずく

やり方
結果
そのまま足し算する
答えがズレる
符号を別に処理
回路が複雑になる
もっと良い方法が必要
そこで補数の登場
5
5
データの表し方 - 0と1の世界

補数という考え方

時計の針を例に、引くかわりに進める発想を見てみましょう。

補数(ほすう)

ある数を引くかわりに、足して同じ結果にできる相手の数のこと。

時計で3時間戻す=9時間進めるのと同じ

「引く」を「足す」に置きかえられる

この発想でマイナスを表す

6
6
データの表し方 - 0と1の世界

1の補数(反転)

まずは全部の桁を0と1で入れ替えるだけの簡単な操作です。

  • 0は1へ、1は0へ反転
  • 例 0101 → 1010
  • これを「1の補数」と呼ぶ
7
7
データの表し方 - 0と1の世界

2の補数(反転 +1)

1の補数にもう1足すだけで、マイナスを表す形が完成します。

元の数を用意 例 0101 (5)
全部の桁を反転 1010
最後に1を足す 1011 (これが −5)
8
8
データの表し方 - 0と1の世界

なぜ2の補数が便利か

2の補数を使うと、引き算をわざわざ用意しなくて済みます。

普通の引き算

  • 引き算専用の処理が要る
  • 符号も別で考える
  • 仕組みが増える

2の補数なら

  • 引く数を補数にする
  • あとは足すだけ
  • 足し算だけで済む
9
9
データの表し方 - 0と1の世界

例 実際に計算してみる

7−5 を、5の2の補数を足す形で計算してみましょう。

5の2の補数は 1011 (−5)
7 (0111) に 1011 を足す
答え 0010 (=2) 引き算が足し算に
10
10
データの表し方 - 0と1の世界

桁あふれ(オーバーフロー)

決めた桁数を超えると、はみ出した分が消えてしまいます。

オーバーフロー(桁あふれ)

計算結果が用意した桁数を超え、上の桁がこぼれ落ちてしまう現象。

時計が12を超えて1に戻るのと同じ

はみ出た桁は捨てられる

扱える範囲を超えると起こる

11
11
データの表し方 - 0と1の世界

練習問題

ここまでの理解を、かんたんに確かめてみましょう。

  • Q1. 1の補数の作り方は?
  • Q2. 2の補数は反転のあと何をする?
  • Q3. 2の補数で引き算は何に変わる?
12
12
データの表し方 - 0と1の世界

表せる範囲

桁数(ビット数)が増えると、表せる数の範囲も広がります。

プラスもマイナスもありの範囲
表せる個数

4ビット

−8 〜 +7

16通り

8ビット

−128 〜 +127

256通り

16ビット

−32768 〜 +32767

65536通り

13
13
"

マイナスは「2の補数」という仕組みで、0と1だけで表せます。 反転して1を足すだけ。おかげで引き算が足し算に変わり、コンピュータはシンプルに計算できるのです。

データの表し方 第3回 — 進数と補数

14
14