• ベストアンサー

補数

10進数の -6と-51 を2,8,16進数で表すにはどうすればいいのですか? 過程を詳しく知りたいです。 マイナスが入るとどうすればいいのかわからないです。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

補数となると「1の補数」と「2の補数」があって、ちょっと複雑です。 補数ではなく「負数」となると、意外と単純。 負数は単に「符号ビットが1になっている数値」です。 で「符号ビット」は、普通は「任意のビット数で数値を表す時、最上位のビット」を使います。 例えば「2ビットで数値を表す時、最上位ビットが1なら負数、0なら正数」と決めると、表現出来る数値は以下の4つです。 10 -2 11 -1 00 0 01 1 ここで「『-1』に1を足すと『0』になる」と言う数学のお約束があるので「-1」は「11」になります。 実際「11」に「1」を足すと「00」になります(「100」にはなりません。3ビット目は溢れて消え、下の2ビットの「00」だけ残ります。 上記の例では「2ビットで数値を表す時」でしたが、これが「8ビットで」「16ビットで」「32ビットで」となると、以下のようになります。 8ビット 11111101 -3 11111110 -2 11111111 -1 00000000 0 00000001 1 00000010 2 8ビットでは、-128~-1、0、1~127を表現できます。 16ビット 1111111111111101 -3 1111111111111110 -2 1111111111111111 -1 0000000000000000 0 0000000000000001 1 0000000000000010 2 16ビットでは、-32768~-1、0、1~32767を表現できます。 32ビット 11111111111111111111111111111101 -3 11111111111111111111111111111110 -2 11111111111111111111111111111111 -1 00000000000000000000000000000000 0 00000000000000000000000000000001 1 00000000000000000000000000000010 2 32ビットでは、-2147483648~-1、0、1~2147483647を表現できます。 8進数、16進数の時は、上記の2進数を単純に8、16進数に変換するだけです。 例えば、質問にある-6から0までを8ビットで表現するなら 11111010 -6 372(8) FA(16) 11111011 -5 373(8) FB(16) 11111100 -4 374(8) FC(16) 11111101 -3 375(8) FD(16) 11111110 -2 376(8) FE(16) 11111111 -1 377(8) FF(16) 00000000 0  000(0) 00(16) となります。 ここで注意が1つだけ。「数値が何ビットで表現されているか?」が判っていないと、符号ビットの位置が決まらないので、8進数/16進数で書かれた数値を見ただけでは、数値が正数か負数か判断する事は出来なくなります。 例えば、6ビットの世界での-1を、2進、8進、16進にしてみます。2進では「111111」、8進では「33」、16進では「3F」になります。 -1が16進数で3Fになりましたが、ここで、16進数を知っている人に「16進数の3Fって、10進数で幾つ?」って聞いてみましょう。たいていの人が「63」と答えます。-1と答える人は居ない筈です。 なぜ全員が「63」と答えるかと言うと、質問に「数値を6ビットで表現した場合で」「最上位ビットは符号ビットで」と言う条件を示していないからです。 さて、ここで、質問への回答を考えてみます。 「10進数の -6と-51を2,8,16進数で表すにはどうすればいいのですか?」と言う質問ですね。 質問には「数値を何ビットで表現するか」が明確に書かれていません。何ビット分の2進数にするか、何ビット分の8進数にするか、何ビット分の16進数にするか、が判らなければ、符号ビットの位置も決められず、何桁書けば良いのかも判りません。 そうすると、質問の答えは、 「2、8、16進数にする時のビット数が不明なので、符号ビットの位置が決められず、2、8、16進数に変換する事が出来ない」 と言う事になります。 「マイナスが入るとどうすればいいのかわからないです。」については、 ・数値を何ビットで表現するか決める ・何ビットで表現するか決めたら、最上位ビットを符号ビットにする ・「-1は全部のビットが1になる」と言うお約束(-1に1を足すと0になるお約束の事)を元に、求めたい数値を2進数にする(-1から順に1づつ引いても良いし、1、2、4、8、16、32づつ引いても良いし、補数を使って求めても良い) ・2進数から、8進、16進数にする と言う方法で各進数に変換して下さい。

sisuado
質問者

お礼

ありがとうございました。 >>質問には「数値を何ビットで表現するか」が明確に書かれていません。 問題が表のようになっていて、「空欄をうめよ」となっています。8桁の2進数が書かれている欄があるので8桁だと思います。すいませんでした。

その他の回答 (5)

回答No.6

桁数が書いてないと問題として不適切だと思いますが、No.3の補足を見ると2進数は8桁で求めるんですね。 -6の場合、 2進数・・・数字を2進数にして1の補数に1を足す  6→00000110→11111001→11111010 8進数・・・数字を8進数にして7の補数に1を足す(とりあえず3桁)  6→006→771→772 16進数・・・数字を16進数にして15の補数に1を足す(2桁)  6→06→F9→FA ※N進数の(N-1)の補数は、各桁の数字を(N-1)から引きます。

sisuado
質問者

お礼

ありがとうございました。

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.5

No.2 です。 > 2進数の足し算、引き算、やったことがありません。。。 10進数と全く同じですよ。 下の位から順に足していって、繰り上がったらひとつ上の位に渡す。例えば 3+6 = 13 を2進数でやると、 00000011 00000110 -------- 00001001 です。小学校でやった足し算の筆算を思い出しながらやってみてください。 さて、ここからが計算機上で負の数を2の補数表示にしている最大の理由ですが、例えば、4 + (-2) のような負の数が混じった計算でも、全く同じやり方で計算できてしまいます。 00000100 11111110 -------- 00000010 4の位(右から3つめ)で繰り上がった1が、左に伝播していって最終的に左から溢れてしまいますが、無視します。 ちゃんと答が2になっていますね。 -3 + -2 のような負の数どうしの計算も試してみましょう。 11111101 11111110 -------- 11111011 しっかり-5になっています。 引き算も同じです。上の3つの例で普通に引き算の筆算を試してみればわかると思います。

sisuado
質問者

お礼

二度もありがとうございます。 引き算試してみます。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.4

> 2,8,16進数で表すには 2進数の表し方に「1の補数」「2の補数」があるのは教科書に書いていますよね。 10進数の場合で補数というのは、ある数を足して99…9とか、100…0とかの数になる数の事です。 10進数の場合で、7に対する9の補数は2、7に対する10の補数は3となります。 10進数の場合で、123に対する9の補数は876、123に対する10の補数は877となります。 -- 2進数の6は110です。 プラスの場合は頭に0、マイナスの場合は頭に1をつける事にします。 +6=+110=0110 -6=-110=1110 これも正負の数値の表現方法のひとつです。 問題は、 +6=0110 -6=1110 を符号を無視して足し算すると、  10100 となり、0にはなりません。 常に先頭の符号を見ながら、0なら足し算、1なら引き算とせねばならず、コンピュータで扱うのに非常に都合が悪い事になります。 そこで、 +6=0110 -6=???? を足して  10000 となるように????の部分を決めてしまえば、足し算と引き算を区別しなくてすむじゃん? という考え方が出てきます。 この場合は、????の部分は10000から0110を引き算して得られます。 この考え方が2進数での2の補数に相当します。 -- > 10進数の -6と-51 > を2,8,16進数で表すにはどうすればいいのですか? ですから、プラスの数 6=0110(2進)=06(8進)=06(16進) を足して、 10000(2進)、100(8進)、100(16進) となる ????(2進)、??(8進)、??(16進) を答えれば良いという事になります。

sisuado
質問者

お礼

ありがとうございました。 2進数の足し算、引き算、やったことがありません。。。 もしよろしければ教えて下さい。

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.2

まだ締め切られてませんが、全く同じ質問が前に出ていますのでご参考に(下記URL)。 どちらの質問者の方も勘違いされているのかもしれませんが、 10進数の-6を2進数表示 → -110 というのが正しいんですよ。 2の補数表示というのは、計算機上ではそのように負の数を表現したほうが、いろいろと都合がいいのでそうしているだけです。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1069969
sisuado
質問者

お礼

ありがとうございました。

  • a1308601
  • ベストアンサー率38% (5/13)
回答No.1

8,16進数の場合はよく分かりませんが、2進数の場合は まずマイナスを外してプラスの部分をビット表示します。(6は0110) それから各ビットを反転させて(1001)1を足します。(1001+0001=1010) で補数の場合は最上位ビットが±の役目をしていて1の場合はマイナス、 0の場合はプラスとなるわけです。(1010=-8+2=-6)

sisuado
質問者

お礼

ありがとうございました。

関連するQ&A

  • 補数

    10進数の2の補数は8 8進数の7の補数は1 2進数の1の補数は1 10進数の9の補数は4 と授業でやりました。 なぜこのようになるのか全くわかりませんでした。 過程を詳しく知りたいです。

  • 2の補数

    2進数の0と1を反転し,その結果に1を加えれば数の符号が変わるのはなぜですか?

  • 2の補数

    http://www.pursue.ne.jp/jouhousyo/sysad/sysad010.htm このサイトを見て思ったのですが、2進数→10進数にする場合先頭に1がついてれば負、0だったら正と判断するんですよね? 疑問なんですが、 10進数で250は2進数で11111010となりますよね。このサイト通りに考えると11111010は先頭に1がついてるので負と考え処理して計算すると元の10進数の250になりませんよね・・・ もし、 「11111010を10進数に直しなさい。負の数の場合は2の補数表現を用いなさい」 という問題があった場合はどう解けばよろしいのでしょうか?

  • 2に補数

    10進数から2進数を2の補数にする時はビット反転して1を足すとできますが、2進数から10進数を2の補数にするときも同じくビット反転して1を足すと正解の答えが出るのですが、そのやり方でいいのでしょうか?

  • 補数

    10進数の補数の問題で、決められた数値が1000で与えられた数値が50のときの10の補数が50となるのは分かるのですが、桁数を8桁までに限定したときの10進数89467の10の補数を求めるという問題のとき、「桁数を8桁までに限定する」というのはどういうことなのか教えてください。

  • 2の補数

    (1)10進数1、2、3の値を2進数3桁で記述しなさい。またこれらの2の補数を求め3桁で記述しなさい。 (2)2進数における「2の補数」は、コンピュータにおける数値の扱いにおいて重要な役割を担うことができる。その役割について説明しなさい。 (3) (1)の解答から(2)で解答した役割は適切に機能していることが分かる。その理由を説明しなさい。 (4)2進数で表記したある数値の「2の補数」の求め方としてして、「各桁の1と0を反転し、それに1を加える」という方法がある。この方法が成立する理由を説明しなさい。(ヒント:2^b-1がどういう数であるかを考えるとよい) この問題の(2)からどう説明していいか分かりません。 どなたか教えて下さい。

  • 2の補数について

    情報処理試験(基本情報)用の考え方という前提でお聞きします。 「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。 この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします) として記述されているものは、もう2の補数になっていると考えていいのでしょうか? それともこれを、今から2の補数に直すのですか? (もし直すのであれば、最上位ビットの符号が変わるのでしょうか?) 違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、 「-A」の2の補数は「A」になるんでしょうか? それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という ことになるのでしょうか? 解りにくくてすみません。

  • 1と2の補数

    10進数整数0、11、13を1の補数に変換 10進数整数0、32、45、を2の補数に変換 という問題がよく分かりません。 分かるかたおしえてください。おねがいします。

  • 2の補数

    2進数で4桁の数を考える場合、2の補数では基数が〔10000〕となり、1の補数では「1111」となります。 なぜ、4桁の基数は同じ4桁の「1000」とならず5桁の「10000」となるのでしょうか? どなたか。教えてください。

  • 補数について教えてください!

    情報処理技術者試験の内容なんですが、やり方も理解できず悩んでいます。教えてください。 その1. 2の補数を使って解きなさい   0110  -)0111 ------------ その2. 次の2進数は2の補数であらわした負の値である。符号付きの10進数に変換しなさい。  1) 1001  2) 1010  3) 1111  4) 1000 その3. 次の10進数を2の補数(4ビット)に変換しなさい。  1)-6  2)-3  3)-5  4)-4 本を見ながら解いているのですがいまいち理解できません。お手数お掛けしますが、解る方がいらっしゃいましたら解説付で教えてくださると助かります!よろしくお願いいたします!