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

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

解決済みの質問

補数について質問

例えば2進数であれば、ある数aの補数はその数aの負の値ですが、
その理由は、最上位の桁を無視するからですか?
例えば10進数の10の補数では、39の補数は61ですが、最上位の桁を無視するので、-39が補数とも言えますよね?
yesかNoかでお答え頂けましたら幸いです。

具体的な式で説明します、この考え方も正しいか判定してくだされば幸いです。



(ex:51-39

補数の概念で計算:51+(61-100)=12

(61-100)は最上位の桁を無視する式に対応していて、その答えは-39。

投稿日時 - 2012-02-15 05:13:30

QNo.7306015

すぐに回答ほしいです

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

ただ「39の補数」と言っても、
39+61=100 の 100 を無視すればよいのか、
39+961=1000 の 1000 を無視すればよいのか
判らないから、答えが決まりませんね?
本来は「10の補数表示」ではなく、
「100の補数表示」とか「1000の補数表示」とか
言わなければ、意味が伝わらないはずです。
実際には「100の補数表示」「1000の補数表示」でなくて、
「100を法とする剰余」「1000を法とする剰余」と呼ぶ
習慣になっています。

100を法とする剰余においては、61≡-39 (mod 100) ですから、
61 と -39 は同じ数と考え、特に区別しません。
39 の補数は、どっちだと言っても同じことなのです。
その意味で、質問への答えは yes です。

コンピュータ用語の「2の補数表示」も、
桁数 n を明示して「2^n の補数表示」と
言わなければいけないはずですが…
歴史的に、そうなってはいません。
コンピュータの世界と数学の世界では、
用語の厳密さへの意識が異なる
ということでしょう。

投稿日時 - 2012-02-15 16:03:04

お礼

丁寧なご回答まことにありがとうございます!
再度質問します!

投稿日時 - 2012-02-16 07:53:06

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

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

回答(3)

ANo.3

コンピュータでは「1の補数」と「2の補数」があります。

#1さんが示したのは「1の補数」です。マイナスの数をbit列の0と1を反転して表す,やり方です。
「2の補数」は「1の補数」を1つずらせて,1000は-8を表す約束です。
加減算に便利なので,「2の補数」を使うことが多いように思います。

Alice先生おっしゃるように,本来はbit長を決めないと,2の補数は決まりません。
ハードウェアから,レジスタのbit長は4,8,16,32bitなどに決まります。

たとえば,8bitのとき,MSB(左端)から,-128,64,32,16,8,4,2,1(LSB:右端)の重みを持つと考えます。
最上位の桁MSB(左端)は,+128ではなくて,-128の重みを持つという約束だと思えばよいのです。
最上位の桁を無視するというより,マイナス(2^(bit長-1))の重みを当てると考えるのではないかと思います。

投稿日時 - 2012-02-15 16:33:13

お礼

丁寧なご回答ありがとうございます!
再度質問します。。

投稿日時 - 2012-02-16 07:53:26

ANo.1

引き算では、引く数の補数を足して最上位の桁を無視すると、結果が同じになる、という理屈から、引き算を足し算で表現することができるようになります。
特にコンピュータの世界では、足し算の繰り上がりよりも引き算の繰り下がりの方が厄介なので、足し算に変換して計算したほうがスマートになる、ということだと思います。

ついでに言えば、コンピュータの2進数では最上位の桁が正負の記号を表現しているので、余計わかりにくくなりますね。


最上位にだけ2進数の表現を持ちこむので、説明として理解に苦しむと思いますが、

039の補数は(9-0)(9-3)(9-9)+1=961
039+961=000 最上位の桁は無視

ちなみに、961は-39を表す。

といった感じです。

0000(2) = 0(10)
0001(2) = 1(10)
0010(2) = 2(10)
0011(2) = 3(10)
0100(2) = 4(10)
0101(2) = 5(10)
0110(2) = 6(10)
0111(2) = 7(10)

1000(2) = -7(10)
1001(2) = -6(10)
1010(2) = -5(10)
1011(2) = -4(10)
1100(2) = -3(10)
1101(2) = -2(10)
1110(2) = -1(10)
1111(2) = -0(10)

のような感じで。
実用上は負数は1つずらしてますかね。

投稿日時 - 2012-02-15 11:14:45

お礼

丁寧なご回答まことにありがとうございます!

投稿日時 - 2012-02-16 07:52:30

あなたにオススメの質問