• ベストアンサー
  • 困ってます

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

  • 質問No.5982301
  • 閲覧数3205
  • ありがとう数79
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 88% (215/242)

問:負数を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の補数を使用していなかったので、疑問に思っています。


頭が混乱しております・・・。
回答宜しくお願い致します。

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

  • 回答No.4
  • ベストアンサー

ベストアンサー率 61% (1597/2589)

論理シフトと算術シフトの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回答
お礼コメント
ipyodora

お礼率 88% (215/242)

お礼が遅くなりすいませんでした。
回答ありがとうございました。
投稿日時:2010/11/16 22:59

その他の回答 (全4件)

  • 回答No.5

ベストアンサー率 61% (1597/2589)

「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の補数を解説した途中の箇所を間違えて参照しているのでしょう。
お礼コメント
ipyodora

お礼率 88% (215/242)

お礼が遅くなりすいませんでした。
何度もご丁寧に説明していただきありがとうございました。
投稿日時:2010/11/16 23:02
  • 回答No.3

ベストアンサー率 61% (1597/2589)

質問文の中で紹介されていた
> 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)なら負数であると判断できます。よって,

> 符号付きでない場合は、上記はすべて正の数と言う事で合ってますか?

合っています。
お礼コメント
ipyodora

お礼率 88% (215/242)

お礼が遅くなりすいませんでした。
回答ありがとうございました。
投稿日時:2010/11/16 22:59
  • 回答No.2

ベストアンサー率 51% (78/151)

ア 8191
イ -8193
ウ -8192
エ -1

「2の補数」表現からやり直してください。
  • 回答No.1
おそらく、ipyodoraさんは
ア 1FFF
イ DFFF
ウ E000
エ FFFF
が、十進数でいくつなのか判っていらっしゃらないのでは?
それが判っていれば、過去の質問の回答が理解できるはずです。

試験問題を解く以前にそれが判らないと全く先に進めないので
まず、その基本的なところをおさえて置かないと駄目なのでは?

ヒントとして
2の補数の定義から、最上位のビットが立っている場合には
2の補数+A = 0000 (キャリー 1)
となる値Aの負数(ーA)が十進数の値になります。

ちょうどいいサイトが見つかったので

http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fusu.htm

をみて考えてみましょう。
お礼コメント
ipyodora

お礼率 88% (215/242)

()は十進数
ア 1FFF(8191)
イ DFFF(-24575)
ウ E000(-28671)
エ FFFF(-32767)
問に『負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示』となっているので、各ア~エの16進数を2進数に変換した時の最上位のビットは符号ビットとして考えて、この値になりました。合ってますでしょうか?
なんだか、混乱から抜け出せませんでした。紹介されたサイトには1000 0000(2進法)は-127(10進法)と書いていましたが、-128で合ってますか?

むずかしいです・・・。自分でもびっくりする程分かりません・・・。
投稿日時:2010/06/22 01:10
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ