重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

補数とはなんですか?
ネットにはいろいろな説明があり正直混乱しています。

1,補数とはその数に足したときに基数になる数のこと。
続きに、補数には基数の補数と減基数の補数があるとあります。
これは先の説明に矛盾するような気がします。

2,補数とはその数に足したとき基準となる数になる数のこと。
続きに、nの補数(完全補数)とn-1の補数(不完全補数)があるとあります。
ということはnとn-1しか”基準となる数”にはなりえないということですか?
10進数なら10,9の補数だけで、8の補数、7の補数…1の補数はないということですか?

3,補数とはその数に足したときに位が上がる最小の数のこと。

どれが正しいのでしょうか?それとも昔、1byteは8bitだよ、いや6bitだよみたいなことがあったように曖昧なかんじなのでしょうか?



正直、基本的に2進数の補数しか扱わないのでそこまで問題にはならない気もするのですが、気になりました。

質問者からの補足コメント

  • 「桁あふれ + 0」の+0というのは桁があふれる最小の数だということでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/09/15 21:11
  • なるほど。たして基数になる数ではなく、足して基数のべき乗の数(十進数なら10,100,1000二進数なら2,4,8)になる最小の数ということなのですね。

    数学というよりはコンピュータの用語だから、2進数が念頭に置かれてて、10進数を持ち出すのはいささかナンセンスな感じなんでしょうか?

    2進数でa + not aをしても0x11111...になって基数のべき乗の数(0x10,0x100,0x1000...)にならないと思うのですがnot aも補数なのでしょうか?
    2進数において足して基数のべき乗の数になる最小の数はnot a + 0x1であるのでnot a + 0x1が2進数における補数なのではないのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/09/15 21:46
  • なるほど。確かに3958262 に対する補数なんて考えても実用性がありませんよね。

    ある基準となる数 A があって a+b = A のとき b を「A に対する a の補数」という。しかし実用上、基準となる数Aは基数の適当なべき乗か基数の適当なべき乗−1のどちらかしか使い道がない。

    これが個人的に一番しっくりくる気がします。それか、

    基数の補数は、足すと基数の適当なべき乗になる数。(基数のべき乗になる最小の数)
    減基数の補数は、足すと基数の適当なべき乗−1になる数。(基数のべき乗−1になる最小の数)

    とするのがいいのではないかと思います。

    やっぱり、補数を「足すと基数の適当なべき乗になる数」とすると、基数の補数はわざわざ「基数の」と言う必要はないし、減基数の補数の存在がどうしても引っかかる気がします。

    No.5の回答に寄せられた補足コメントです。 補足日時:2021/09/16 09:59

A 回答 (7件)

№2です。


[2進数でa + not aをしても0x11111...になって基数のべき乗の数(0x10,0x100,0x1000...)にならないと思うのですがnot aも補数なのでしょうか?]
説明不足ですみません。減基数の補数です。
a = 0x0011-0101
~a=0x1100-1010
  0x1111-1111
ですね。
    • good
    • 1

「補数」というのは、正確な定義を持つ用語というよりは、


引き算を足し算または足し算ぽいもので実装できるようにする記数法
というムーブメントの名前だからねえ。
二進記法における2の補数と1の補数も、あまり統一感のない命名だが、
「ああ、引き算を足し算でやる例のアレね」程度で通じ合う符丁だと思えば
あんまり腹は立たない。「2の補数」と「1の補数」を別個のものとして
それぞれ覚えればいいだけだ。方向性は、何となく同じなのだから。
    • good
    • 1
この回答へのお礼

なるほど。ありがとうございます。符号付き整数を二進数で表現するってところでしか「補数」はでてこないものなのですね。だとすると「引き算を足し算または足し算ぽいもので実装できるようにする記数法」。確かにその程度の理解で間に合うのでしょうね。僕は昔から難しく考えてしまうクセがあるようです。

お礼日時:2021/09/16 10:13

一般論としては


ある基準となる数 A があって a+b = A のとき b を「A に対する a の補数」という
のがもとにある. この「基準となる数」は本来なんでもいいんだけど, 例えば
3958262 に対する補数
を考えてもたぶん実用性がないわけで, 現実的には
・基数の (てきとうな) べき (基数の補数)
・基数の (てきとうな) べき-1 (減基数の補数)
のどちらかしか選びようがない.

b進数表記をするときには「基数の補数」を「b の補数」, 「減基数の補数」を「(b-1) の補数」と呼ぶことがふつうだけど, これは厳密にいうと曖昧性がある. これらが曖昧になる状況が珍しいけど.
この回答への補足あり
    • good
    • 1

No.1 です。

「補足」に書かれたことについて。

>「桁あふれ + 0」の+0というのは桁があふれる最小の数だということでしょうか?

例に書いた「8ビットの2進数」ということであれば、「9ビット目に桁あふれして 0 になる数」ということです。
つまり
 1 0000 0000

これは「1の補数」
  1111 1111
に「1」を加えた数
  1111 1111 + 0000 0001 = 1 0000 0000
の「1 0000 0000」ということです。
「8ビットの2進数」で計算している限り、「9ビット目」はオーバーフローして消滅して
  1111 1111 + 0000 0001 = 0000 0000
になります。(これは「数学的な式」ではなく、コンピュータの中の「8ビットのレジスタ」上の数ということです)
    • good
    • 1

No.1 です。

ちょっと補足。

最後に書いた「1の補数」は、元の数と足し合わせると「全ての桁が1になる」ことになります。
例でいえば
 元の数:0111 0101
 1の補数:1000 1010
足し合わせれば
     1111 1111
ですね。
「1の補数」は「元の数 0 と 1 とを逆転させる」ことで作ったので、そうなるのは当たり前ですね。

このように「元の数 0 と 1 とを逆転させる」ことで単純に作れるのは、2進数の場合だけです。

「8桁の10進数」であれば、元の数と足し合わせると「9999 9999」になる数が「減基数の補数」「n-1の補数(不完全補数)」つまり「9の補数」になるわけです。
    • good
    • 1

10進数では、足して10になるのが補数なので、6の補数が4でわかりやすいのですが、10進数で、16の補数は84です。

基数は10ですが、10のn乗でnが最も小さいものということでn=2,足して100になるものが補数なので84になるのです。
減基数は基数^n-1で、10進数では,9や99などです。
ここで微妙な用語の混乱があるようです。
10進法では10が基数で、a+b=10でもa+b=100でも10が基数なのに、減基数は9と99で、10のn乗のnが決まらないと減基数が決まらないのです。
1の説明では、基数なるものを123でもなんでも、a+b=cのcとしてとらえているように思います。(a,bは互いにcを基数とした補数)123進法としてもよいです。基数のn乗というnではないようです。
2の説明ではnは1の説明と同様、何でもよいものとして説明しているようです。
3では、位が上がるといういいかたで10進法の10,100や2進法の0x10,0x100を説明しているようです。
c++などの~a(チルダ)が補数(not a)であることはご承知のことと思われます。
一般化した説明ではなにを言いたいのかわからないですね。
この回答への補足あり
    • good
    • 1

一般の場合には面倒なので、おそらく「2進数での負数の表し方」のところで出てくる話だと思いますので、そこだけに限定して。



例えば、「8桁の2進数」で「負数」を表す方法です。
「2の補数」を使う方法です。

「補数」とは、相互に足し合わせると「桁あふれ + 0」になる数のことです。
2進数の場合には、それを「2の補数」と呼ぶようです。

「8ビットの数」たとえば「0111 0101」があるときに、これとは別の「1000 1011」という2進数を考えます。
そうすると
 0111 0101 + 1000 1011 = 1 0000 0000
になるので、右辺の「最上ビット(9ビット目)」が「桁あふれ」で消えるとすれば
 0111 0101 + 1000 1011 = 0000 0000
ということになって、「たし合わせると 0 になる数」なので
「0111 0101」の絶対値が同じ負の数は「1000 1011」
ということになります。
それが「2の補数」です。

このためには、「すべての数を8ビットで表わす」(9ビット目は無視する)という「固定ビット数」の表記であることが条件です。

この方式だと、「8ビット」なら
・正数:0000 0000 ~ 0111 1111(10進数で 0~127)
・負数:1111 1111 ~ 1000 0000(10進数で -1~-128)
ということになります。

このように、再上位ビットが「0」なら正数を、「1」なら負数を表わすことになり、実質的に「最上位ビットが符号を表す」ことになります。ただし、負数の場合には残りビットをそのまま読んでも「絶対値」にはならないので要注意です。(あくまで「足して 0 になる」という数ですので)

「2の補数」の作り方は

・元の数:0111 0101
 ↓
・0 と 1 とを逆転させる    ※下記注
 → 1000 1010
 ↓
・それに「1」を加える
 → 1000 1011      ←これが「2の補数」

で出来上がり。

(※注)これを、便宜上「1の補数」と呼ぶことがあります。
質問者さんが書かれている「減基数の補数」だの「n-1の補数(不完全補数)」というのは、多分このことでしょう。
「補数の完成形(桁あふれ + 0)から「1」を引いたもの」「1を足すと補数の完成形(桁あふれ + 0)になる」という意味だと思います。
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!