- ベストアンサー
負数を2の補数で表現する符号付き16ビットの2進数の問題について
- 負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示し、4倍するとあふれるものはどれか。
- 16進数で表現した場合、負数と正数の2進数表現は異なる。
- 問題の解き方については解説が異なるが、正しい解法は2の補数を使用すること。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
論理シフトと算術シフトの2種類を理解することは, 基本情報技術者試験の試験範囲に含まれています。 http://akademeia.info/index.php?%A5%B7%A5%D5%A5%C8%B1%E9%BB%BB データ型が符号なし整数や文字型であったなら論理シフトの動作になりますし, データ型が符号あり整数(2の補数)だったなら算術シフトの動作になります。 シフトによって正数が突然負数になったり,負数が突然正数になったりするのは異常な事態ですから,それを避けるために符号ビットを動かさない「算術シフト」が用いられます。 今回の問題は「負数を2の補数で表現する符号付き16ビットの2進数」と明記してありますから,その動作は算術シフトです。 よって,下記の私の解説が正しいです。 > http://okwave.jp/qa/q4302488.html のANo2回答
その他の回答 (4)
- jjon-com
- ベストアンサー率61% (1599/2592)
「ANo.1のお礼」に対して。 ア 1FFF(8191)←これだけが正解。 イ DFFF (1101 1111 1111 1111) →負の数(先頭ビットが1)なので,どんな数かそのままでは不明。 ビット反転の後+1して正数にすれば,どんな数か判明する。 →0010 0000 0000 0001(=8193) →よって元の数は「-8193」 ウ E000 (1110 0000 0000 0000) →負の数(先頭ビットが1)なので,どんな数かそのままでは不明。 ビット反転の後+1して正数にすれば,どんな数か判明する。 →0010 0000 0000 0000(=8192) →よって元の数は「-8192」 エ FFFF (1111 1111 1111 1111) →2の補数表現において,オール1のパターンは「-1」 (納得いかなければ,ビット反転の後+1して確認してください) >紹介されたサイトには1000 0000(2進法)は >-127(10進法)と書いていましたが、-128で合ってますか? いいえ,あわてずに最後まで読めば,リンク先には-128と書いてあります。 1の補数を解説した途中の箇所を間違えて参照しているのでしょう。
お礼
お礼が遅くなりすいませんでした。 何度もご丁寧に説明していただきありがとうございました。
- jjon-com
- ベストアンサー率61% (1599/2592)
質問文の中で紹介されていた > http://okwave.jp/qa/q4302488.html のANo2回答 の回答者本人です。 細かい個々のご質問に対してはいまから回答していきますが, 結論から言うと私の解説が正しいです。自信があります。 >16進数が正の数でも、2進数だと負数になると言う事でしょうか? これは質問がおかしい。コンピュータにとって自明的に存在するのは単に「ビット列」であって,正数なのか負数なのかは解釈の違いでしかないので。 例えば次のような16ビット長のデータがあるとします。 1111 1111 1111 1111 これは,符号なし整数と解釈すれば65535ですし,符号あり整数(2の補数)と解釈すれば-1です。画素と解釈すればある色が最大の輝度で光っている状態でしょうし,命令と解釈すればある動作をする命令コードを表しているでしょう。 ですから「1111 1111 1111 1111」というビット列だけ与えられて, 「これは符号なし整数か? それとも符号あり整数(2の補数)か?」という問いに答えるのは不可能です。 >回答を見る感じでは16進数を2進数に変換しただけで、 >『2の補数で表現』の部分がないように思えます。 まったくそのとおりで,16進というのは「2進を4ビットずつまとめて0~Fの1文字に変換しただけ」のものです。16進数だけを見て,それが符号なしか符号ありかを判断することは不可能です。 問題文に「負数を2の補数で表現する」と解釈のための前提が与えられてはじめて, 16進数の最左桁が0~7(0000~0111)なら正数であるし,8~F(1000~1111)なら負数であると判断できます。よって, > 符号付きでない場合は、上記はすべて正の数と言う事で合ってますか? 合っています。
お礼
お礼が遅くなりすいませんでした。 回答ありがとうございました。
- e3tatsu
- ベストアンサー率51% (78/151)
ア 8191 イ -8193 ウ -8192 エ -1 「2の補数」表現からやり直してください。
おそらく、ipyodoraさんは ア 1FFF イ DFFF ウ E000 エ FFFF が、十進数でいくつなのか判っていらっしゃらないのでは? それが判っていれば、過去の質問の回答が理解できるはずです。 試験問題を解く以前にそれが判らないと全く先に進めないので まず、その基本的なところをおさえて置かないと駄目なのでは? ヒントとして 2の補数の定義から、最上位のビットが立っている場合には 2の補数+A = 0000 (キャリー 1) となる値Aの負数(ーA)が十進数の値になります。 ちょうどいいサイトが見つかったので http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fusu.htm をみて考えてみましょう。
お礼
()は十進数 ア 1FFF(8191) イ DFFF(-24575) ウ E000(-28671) エ FFFF(-32767) 問に『負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示』となっているので、各ア~エの16進数を2進数に変換した時の最上位のビットは符号ビットとして考えて、この値になりました。合ってますでしょうか? なんだか、混乱から抜け出せませんでした。紹介されたサイトには1000 0000(2進法)は-127(10進法)と書いていましたが、-128で合ってますか? むずかしいです・・・。自分でもびっくりする程分かりません・・・。
お礼
お礼が遅くなりすいませんでした。 回答ありがとうございました。