• ベストアンサー

2の補数について

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

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

  • ベストアンサー
  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.3

>問題文中の符号ビットが負数だったら、 >変換してしまうという考えでいいのでしょうか? 違います。計算過程で一時的に変換を行うのか、と言われればその通り、ということになりますが。 おそらく、手順としては正しく理解されており、言葉の用法が正しくないと思われます。 11010B=-11、という対応関係を見る際に2の補数を取っているのは、計算の便宜上のものであって、数自体を変換しているわけではありません。 x=10101Bがどの数に対応するのか、というのを調べる際には、次のように考えます。 但し、この議論は「負数を2の補数形式で表現する」場合の話です。 1.符号ビットが1なので、これは負の数として解釈しなければなりません。 2.ところが、負の数を表すビット列を直接数値に直すのは、慣れていないとなかなか難しい物があります。 3.そこで、-xがどの数に対応するのかが分かれば、xがどの数に対応するのかが分かる、というふうに考えます。 4.ビット列xから、-xを求めるには2の補数を取ればよいので、-x=01011Bとなります。 5.このビット列は11を表していますので、-x=11、が分かりました。 6.従ってx=-11です。 つまり、計算の過程で、計算の便宜上-xを算出するために2の補数を取って(-1倍して)いるに過ぎず、きちんと5→6の際に-1倍して元に戻しています。 数自体を変換しているわけではありません。 操作自体は理解されておられるようですから、あとは言葉の使い方の問題だと思われます。 一応、変換の手順を場合分けしておきます。(負数を2の補数で表現する場合) ・最上位ビット(符号ビット)が0のとき 素直に2進数を10進数に直せばOKです。 ・符号ビットが1のとき 元の数をxとします。xを10進数に直すのは慣れが必要ですので、慣れのいらない場合に帰着させます。 つまり、-xを求めれば、それを-1倍してxを求められる、という考えをします。 xから-xを求めるには2の補数を取れば良いです。 こうして得られた結果は-xですから、最後に-1倍します。 ここで2の補数を取ってはいますが、後で-1倍するので、xの2の補数に対応する数を最終結果としているのではないことに注意してください。 つまり、この計算方法は「便宜上2の補数を利用している」のであって、「2の補数を取ったものを求めている」わけではありません。 次のようにも言うことができます。 ・どんな場合でも与えられた数の2の補数を取ったものを求めて最終結果とする、ということはしない ・符号ビットが1の時には、2の補数=-1倍、という対応関係を計算の過程で利用する。つまり、2の補数を利用する 「2の補数を結果とする」と「計算過程で利用する」の言葉の違いを理解していただければ幸いです。 前者は「最後にマイナスを付ける」というニュアンスがありません。 ちなみに、負数を2の補数で表現する場合には、(オーバーフローしない場合には)10進に直してから足しても、ビット表現のままで2進数として足しても結果は同じになりますが、 負数を1の補数で表現する場合にはそのようなことは成り立ちません。

yuki_yuu
質問者

お礼

>どんな場合でも与えられた数の2の補数を取ったものを求めて最終結果とする、 >ということはしない わかりました!計算上、自分が変換したものは、元に戻さないとだめなんですね。 確かにおっしゃるとおり、日本語的な理解の問題ですねー。 問題を解くことの前に、問題文の意味を理解する練習が必要かな。 でもあと一週間だし、あー・・・。 だけど2の補数の問題が出たら、頂いた回答を思い出して頑張ります(^o^) ありがとうございました。

その他の回答 (2)

  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.2

「負数を2の補数形式で表現」という言葉は、数と、そのビット表現の対応関係を規定する言葉であり、ある1つの数についての言葉ではありません。 あるビット列の2の補数、という言葉と混同していませんか? 前者は -1 <--> 11111B -2 <--> 11110B -3 <--> 11101B ... という対応関係を示す言葉であり、後者は00101Bの1の補数は11010B、2の補数は11011B、 というように変換を表す言葉です。 言い換えれば、次のようになります。 整数とビット列との対応関係を決める、という問題があります。 正の数に関しては自然な対応(4と00100B、等)がありますが、負の数に関しては自然には対応しません。 そこで、「-1」倍の概念を決めれば、この対応を負の数にも拡張できる、という考え方を利用します。 いま、整数には「-1倍」という演算が自然に定義されていますが、ビット列にはそのようなものは自然には定義されません。 ビット列に対する「-1倍」をどう決めるか、というのが「負数を2の補数形式で表現」という問題文に現れているわけです。 つまり、「ビット列に対して、2の補数を取ることと、-1倍することを同一視します」と言っているわけです。 従って、10101Bの2の補数を取る、ということは、問題に与えられた数を勝手に-1倍する、ということですから、もちろんやってはいけません。 この場合、10101Bは-11を表しており、1の補数形式で表現すると10100です。 これは、10101Bの2の補数が01011Bであり、かつ01011Bが自然に11と対応づけられているからです。 上の言葉で言えば、-1倍したら(2の補数を取ったら)11になった、ということです。 これを1の補数表現のルールでビット列化したい場合には次のようにします。 -1倍のやり方が変わっていますが、あくまで表現したかった数は-11ですから、 11をビット列で表しておいてから「-1倍」する、ということになります。 11は01011Bです。この場合の「-1倍」とは、2の補数ではなく、1の補数ですから、10100Bとなります。

yuki_yuu
質問者

補足

詳しいご回答ありがとうございます。 ビット数が少ない私の頭で一生懸命理解に努めましたが、 理解できたかわかりません。以下に「こう理解しました」というのを補足しますので、 お時間ありましたらまた見ていただけますでしょうか? 【11 + (-11)】(これは10進です)を2進に直すと 【01010 + 10101】となるということですよね? ということは、一度10進に直してから計算する場合は、 【10101】の方は2の補数を取って【-11】という値を求めますよね? (一度10進に直す意味は聞かないで下さい(>_<)。癖になってるんです) 【01010】の方はこのまま10進に変換して【11】が出ますけど、 【10101】は、素直に10進にしたら【-5】という値になりませんか? >「負数を2の補数形式で表現」という言葉は、数と、そのビット表現の対応関係>を規定する言葉であり、ある1つの数についての言葉ではありません。 ということですが、だとしたら、【01010】も【10101】も 2の補数への変換を、するのかしないのか、統一しなきゃいけないような 気がしているんです。【01010】はやらなくて【10101】はやる、 という差がわかりません。 問題文中の符号ビットが負数だったら、 変換してしまうという考えでいいのでしょうか? せっかくご説明いただいたのにうまく理解できずにごめんなさい。 お手数おかけしますがよろしくお願いいたします。

  • inetd
  • ベストアンサー率23% (43/184)
回答No.1

符号付2進数だと書いてあるなら普通は最上位ビットが符号になっています。それでマイナスの場合は最上位ビットが1で、2の補数表現になっています。 10101 を5ビットの符号付2進数とすると最上位が1なのでマイナスです。なので分かりやすくするためにまずはプラスにしたとすると (1, 0 を反転させてプラス1する。つまり符号反転させるために2の補数を求める) 01011 で、これは10進数では 11 です。なので元の 10101 は10進数では -11 を表していたということになります。 A の2の補数が -A なら -A の2の補数は A になるのかとのことですが、それはその通りです。ビットの 0, 1 を反転させて1を加えるということを2回繰り返すと元の値になります。

yuki_yuu
質問者

お礼

ご回答ありがとうございます。 2の補数は必ずしも、符号ビットが負数(1)とは限らないということですね。 そうなるとやっぱり、いったいどれが2の補数に変換してあって、 どれがしてないというのが、解らない・・・。 単純に「次の数の2の補数を求めなさい」という問題が出てくれることを 期待します。ありがとうございました。

関連するQ&A

  • 2の補数の計算について

    C言語のプログラム中で得られた10進数の値を,固定長16ビットの2進数に変換したいと考えています. しかしながら,得られた10進数の値が負数であった場合,それを負数と判断し,2の補数として出力したいのですが,なかなかいい方法が思いつきません… 例えば処理中で -1.915098 といったような10進数の値を2進数に変換し,先頭の1ビットが正負符号の2の補数として表現するためにはどのように記述すればよいでしょうか? 簡単で構いませんので,記述例も書いていただけると助かります…

  • 2進数の補数表示について

    よろしくお願いします 「負の数(-128)を8ビットの2の補数表示するとき、どうなるか?」 の問題で、わからない箇所があります。 1.最上位ビットは正・負を表す。 2.負の数:-127を2の補数を使用して表現する。    (例)-1(10)==>    まず、正で考える。      ==> 0000 0001(2)      「確認」 1111 1110(反転)            +1(プラス1) ---------- 1111 1111(2)(答え) -127(10)      ==>0111 1111(2)  まず、正で表す。    「確認」        1000 0000(反転)           +1 (プラス1) ---------- 1000 0001(答え) ここからが疑問なんです。    -128(10)の場合      ==>1000 0000(2) まず、正で考える。    「確認」        0111 1111(反転) +1 (プラス1)       -----------      1000 0000(2)(答え) ↑ ・答えがプラスの128(10)=>10000000(2)と同じではない  でしょうか? ・このときの最上位ビットは桁上がりの「1」と正負の違  いを表す「1」のどちらを表しているのですか? ・たとえば「負数を2の補数で表すとき,8ビットで  表現できる整数の範囲は10進数でどれか。」など  の問題で答えが正の127は理解できるのですが、  負は「-128」ということがよくわかりません。 一応検索をしてみましたが、類似回答では理解できませんでした。よろしくお願いします。        

  • 2の補数の問題

    お世話になります。 初歩的な質問で申し訳ございませんが、質問させてください。 ------------------------------------------------------------- 問:負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示したもののうち、4倍するとあふれが生じるものはどれか。 ア 1FFF イ DFFF ウ E000 エ FFFF ------------------------------------------------------------- 答えはイなのですが、イマイチです。 とある解説だと、4倍すると符号が変わるものがあふれとのことでした。 DFFF →(2の補数)0010 0000 0000 0001 →(4倍する)1000 0000 0000 0100 確かに符号が変わることは分かるのですが、ウでも E000 →(2の補数)0010 0000 0000 0000 →(4倍する)1000 0000 0000 0000 こちらも符号が変わることにはならないのでしょうか? どうぞよろしくお願いいたします。

  • 記数法(n進数)

    ① −(2D)16 を符号付絶対値 8 ビットで表す ② −(146)8 を「負数は 2 の補数で表現する」8 ビットで表す ③ 符号付絶対値 8 ビット (10110101)2 を 10 進数で表す ④「負数は 1 の補数で表現する」 8 ビット (01011001)2 を 8 進数で表す ⑤「負数は 2 の補数で表現する」 8 ビット (10111011)2 を 16 進数で表す ()の後の数字は小文字です。 n進数からm進数への変換と計算はできるようになったのですが、ビットの表現などが分からないので教えて頂きたいです。

  • 1の補数表現

    昔の本を買って情報処理の勉強をしているのですが ふに落ちない事がありまして質問させていただきます。 符号付の整数を8ビットの2進数であらわす時、1の補数表現で最小の数は-128である。 と言う問題がありまして回答が正しいとなっていました。 しかし自分は-127までしか表現できないと思いまして。。。 2の補数表現なら-128~127まで表現できると思うのですが 1の補数表現なら-127~127までしか表現できないと思います。 詳しい方がいましたらよろしくお願いします。

  • 問:負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示

    問:負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示したもののうち、4倍するとあふれが生じるものはどれか。 ア 1FFF イ DFFF ウ E000 エ FFFF 以下は、それぞれを2進数表示にしたものです。 先頭の符号ビットは[0]の表記で目立たせてあります。 ア [0]001 1111 1111 1111 イ [1]101 1111 1111 1111 ウ [1]110 0000 0000 0000 エ [1]111 1111 1111 1111 以下は、4倍したもの ア [0]111 1111 1111 1100 イ [0]111 1111 1111 1100 ウ [1]011 0000 0000 0000 エ [1]111 1111 1111 1100 この場合は、ア以外は負数ですが、『負数を2の補数で表現する符号付き16ビットの2進数を、16進数で表現した場合』は16進数が正の数でも、2進数だと負数になると言う事でしょうか? また、符号付きでない場合は、上記はすべて正の数と言う事で合ってますか? 回答を見る感じでは16進数を2進数に変換しただけで、『2の補数で表現』の部分がないように思えます。この辺りも知りたいです。 問題の解き方についても疑問があります。 http://questionbox.jp.msn.com/qa4278151.html での回答では、 イ DFFF →(シフト前)1101 1111 1111 1111 →(シフト後)0111 1111 1111 1100 先頭ビットが1から0に変わったので「桁あふれ」。 問題集の回答ではこっちで説明されていました。 http://okwave.jp/qa/q4302488.html のANo2回答では (シフト前)[1]101 1111 1111 1111 (シフト後)[1]111 1111 1111 1100 2の補数表現による負の数の場合,シフト操作によって1が消えていくのは問題ない。 シフト操作によって0が消えると結果が変になる。これが「あふれ」 符号はシフトさせず、左に2つシフトさせた事で、10が消えた事で桁あふれとしています。 ANo1の回答では、 DFFFだと同様に 1101 1111 1111 1111で1の補数は 0010 0000 0000 0000 2の補数は 0010 0000 0000 0001 つまり、-8193ですよね。 4倍すると、-32772で、これは16ビットの2の補数表現 で表現できる数の範囲からあふれてしまいます。 DFFFなどの2進数に変換後、2の補数を使用するのが正しいのでしょうか? 最初の2つの回答では2の補数を使用していなかったので、疑問に思っています。 頭が混乱しております・・・。 回答宜しくお願い致します。

  • 補数を利用した引き算について

    こんにちは。 『2進数で 111 - 010 を計算をせよ。』 という問題があります。 つまり10進数でいう所の 7 - 2 = 5 の計算をします。 補数を利用すると引き算が足し算ででき、演算が簡単になることを 本は説明しようとしてるのですが、腑に落ちない点があります。 解説では --------------------------------- 引く数 010 の補数を求めると 101 なので  111 +101 -------- 1101  ↓  101 よって桁上がりを無視した 101 が答え --------------------------------- との事ですが疑問に思うことがいくつかあります。 I. 上記の計算では3ビットであることが前提になっています。 7 - 2 = 5 をしたいわけですから、そうすると  111 ←符号なしの表現 ( 7 ) +101 ←符号付きの表現 ( -2 ) -------- 1101  ↓  101 ←符号なしの表現 ( 5 ) となり、符号なしと符号付きの数値を混ざってしまうが、良いのでしょうか? また、この説明の仕方だと答えが 0~7 になる答えしか出せません。つまり引く数の方が大きいと計算できません。 私は補数を使うのであれば正の値・負の値、全て符号付きの値でなければいけないと思っていたので、 もし私が説明するのであれば全て符号付きにし、そして符号付きで7を表せるようにするために4ビットにして  0111 ←符号付き( 7 ) +1110 ←符号付き( -2 ) ---------- 10101  ↓  0101 ←符号付き( 5 ) とするのであれば納得できます。 答えの範囲も -8~7 と負の値も許容できます。 II. 実際には 本のように引く数だけを補数にして足し算をして答えを求めているのか、 それとも私のように正の値・負の値、ともに符号付きの表現にして足し算をしているのか、 もしくは、いずれとも違うのか、どうなのでしょうか? また、参考文献などがありましたらご紹介お願いします。 以上ですがよろしくお願いします。

  • 符号付の整数8ビット…

    教えてください。 符号付整数8ビットの2の補数で表現するときの11101111-11110011の計算を2進数で示すときの途中の計算方法を教えてください。 10進数のー13を8ビットの固定小数点(負数は2mの補数形式)の途中の計算方法も教えてください。

  • Javaにて負の符号付整数を表現する場合、2の補数を必ず使用するのでしょうか?

    とある、ホームページに、 「Javaでは、負の符号付整数を表現するのに、2の補数 (2's complement) を使います。」 との記述があったのですが、負数表現は必ず2の補数のみなのでしょうか。例外が考えられる場合はありえるのでしょうか。 御回答の程、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 8ビットを2進数で表現すると…

    質問です。 符号付の整数を8ビットの2進数で表現するとき、00110111-11000001の演算結果はどのようになるのでしょうか? 符号ビットは左端にあり、負数は2の補数で表します。

専門家に質問してみよう