みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2の補数が成立する理由

2の補数表現の特長は、桁あふれを無視することで、ある値Aの減算を
Aの2の補数の加算として扱うことができるのはわかるのですが
この特徴が成立する理由というのが分からないのですが、
どういうことでしょうか?

投稿日時 - 2008-07-14 15:50:47

QNo.4175997

すぐに回答ほしいです

質問者が選んだベストアンサー

おお,このように説明すればよいのですね,とても分かりやすいです,さすが数学カテゴリでご活躍の方ですね。今後,私もANo.3の説明をありがたく使わせていただきます。
私はこの説明を少々調整して使わせていただくことになるでしょうか。この点,補足させてください。


>1~12の数字で足し算引き算を考えると『12を法とする合同式』です。

ゼロが存在しないと次の説明がしにくいので「時計盤の12の数字を0に置き換えたもの」をイメージさせます。結果が0~11となる『12を法(除数)とする合同式』です。

2の補数の求め方として「各ビットを反転させて1を加える」という説明がよく用いられるのですが,ゼロが存在する時計ですとこの点を同様に説明できますので。
0 1 2 3 4 5
||||||
11 10 9 8 7 6
上の数と下の数が互いに反転の関係にあります(11の補数)。「3」の12の補数は,3→(反転)→8→(+1)→9,です。


>たとえば現在は2時で、今から3時間経つと(つまり時間を3加える)、
>時計の短針は5を指します。これは2 + 3 = 5ということになります。

2+3=5の例ですと正数だけで計算できてしまいますので,私なら別の例を示すでしょうか。次のように結果が-6~-1のいずれかとなるような例です。

-6,-5,-4,-3,-2,-1,0,1,2,3,4,5 ……正負数への対応づけ
6,7,8,9,10,11,12,1,2,3,4,5 ……実際の時計の文字盤

例えば,2-3=(-1) です。
『反時計回りに3進む(-3)』という引き算の動作と
『時計回りに9進む(+9)』という補数の足し算の動作が等価になります。

投稿日時 - 2008-07-15 09:44:35

このQ&Aは役に立ちましたか?

16人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

話を1バイトに限定します。

1バイトで表現できる数値は「0~255」です。
2の補数では、このうち「128~255」に、『-128~-1』の数を割り当てています。
これって実は、『256を法とする合同式』になっています。
『桁あふれを無視する』というのは『256で割った余りを計算する』ということに対応しています。

例えば、時計には1~12の数が刻まれています。
この1~12の数字で足し算引き算を考えると、それは『12を法とする合同式』です。
たとえば現在は2時で、短針は2を指しています。
今から3時間経つと(つまり時間を3加える)、時計の短針は5を指します。
これは2 + 3 = 5ということになります。
時計の盤上では、『時計回りに進むこと』が足し算に相当します。
(逆に、『反時計回りに進むこと』が引き算に相当します。)
でも時計の場合、ねじを回して時計の針を逆に進めさせることも可能です。
9時間分時計の針を逆行させても(つまり時間を9減らす)、時計の針は5を指しますよね。
これは2 - 9 = 5ということになります。

まとめると、時計の盤上では
『時計回りに3進む(+3)』という足し算の動作と
『反時計回りに9進む(-9)』という引き算の動作が等価になります。

これは2の補数にも言えます。
1バイトの2の補数の場合、0~255の数が円状に並ぶ様子を考えて下さい。
反時計回りに1進むこと(1を引くこと)は、
時計回りに255進むこと(+255すること)と同じになるので、
-1 = +255
のような関係が成り立ちます。
+255は2進数で11111111なので、-1も2進数で11111111となります。

投稿日時 - 2008-07-15 02:28:34

ANo.2

学者ではないので,個人的にそう納得しているというだけですが。
2の補数の加算はなぜ減算として扱える?
というのは流れが逆で,
加算を減算として扱える形式を考えたのが2の補数
なんじゃないでしょうか。

例えば,3bit長の2進数を考えます。
符号なしの固定小数点数なら次のとおり。
111 = +7
110 = +6
101 = +5
100 = +4
011 = +3
010 = +2
001 = +1
000 = +0

で,この3bit長で負数も表現したいなら,2の3乗=8パターンを正数と負数で半分ずつ分け合うことになります。2の補数表現ではこれを次のように対応させました。
111 = -1
110 = -2
101 = -3
100 = -4
--------
011 = +3
010 = +2
001 = +1
000 = +0

この2の補数の正数と負数というのは分断された別の規則から生成されたビットパターンではなく,無視すべき4bit目を適切に想定すると,連続したビットパターンですよね。
[1] 011 = +3
[1] 010 = +2
[1] 001 = +1
[1] 000 = +0
------------
[0] 111 = -1
[0] 110 = -2
[0] 101 = -3
[0] 100 = -4

であるなら,負数であっても符号なし固定小数点数と同様に加算ができる。すなわち,2の補数形式の負数の加算はそのまま計算できる,減算ができるということです。

投稿日時 - 2008-07-14 21:05:54

ANo.1

>2の補数表現の特長は、桁あふれを無視することで、ある値Aの減算を
>Aの2の補数の加算として扱うことができるのはわかるのですが
ここまでわかる。と。

>この特徴が成立する理由というのが分からないのですが
何がわからないのでしょうか?
「この特徴」というのは具体的には何ですか?

投稿日時 - 2008-07-14 16:36:08

あなたにオススメの質問