• ベストアンサー

基本情報技術者

負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示したもののうち,4倍するとあふれが生じるものはどれか。 ア 1FFF   イ DFFF   ウ E000   エ FFFF (平成19年春 問3) この問題の解説で E000の2進表示は1110 1111 1111 1111と書いてありました。 どの問題集を見てもそうかいてあります。 1110 0000 0000 0000ではないんですか?? またあふれがでるっていうのはどういうことなんですか? いまいちよくわかりません。

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

回答に対して一言もお礼を返さない質問者には 私は基本的に回答しないことにしているのですけれど, ANo.1がちょっと気になったので今回は回答してみます。 ANo.1ではわざわざ10進数に基数変換していますが,そうする必要は とくになくて,ビット列からあふれを判断すればいいと思います。 数値を4倍するとは,左に2ビット算術シフトするということ。 算術シフトとは,符号ビットを固定し,符号ビット以外をシフト対象とする操作です。 正の数を算術シフトする例として「ア 1FFF」のデータを用いてみます。先頭の符号ビットは[0]の表記で目立たせてあります。 (a) [0]001 1111 1111 1111 = (8191)10              ↓左に1ビット算術シフト (b) [0]011 1111 1111 1110 = (16382)10              ↓左に1ビット算術シフト (c) [0]111 1111 1111 1100 = (32764)10              ↓左に1ビット算術シフト (d) [0]111 1111 1111 1000 = (32760)10 (a)~(c)までは正しい計算結果が求められていますが,(d)で結果が変になったことがわかります。(c)→(d)の1ビットシフトにおいて「1」が左端からあふれたからです。 結論はこうなります。   正の数の場合,シフト操作によって0が消えていくのは問題ない。   シフト操作によって1が消えると結果が変になる。これが「あふれ」 2の補数表現による負の数の場合,結論はこうなります。   負の数の場合,シフト操作によって1が消えていくのは問題ない。   シフト操作によって0が消えると結果が変になる。これが「あふれ」 ア [0]001 1111 1111 1111 イ [1]101 1111 1111 1111 ウ [1]110 0000 0000 0000 エ [1]111 1111 1111 1111 アが前者の「正の数であり,左に2ビット算術シフトによって0が2つ消える」, ウとエが後者の「負の数であり,左に2ビット算術シフトによって1が2つ消える」 という,問題ないビット列であるのに対して, イだけは「左に2ビット算術シフトによって,1と0が消える」 という,結果が変になるビット列です。このイだけが,あふれが生じています。

kimosu
質問者

お礼

詳しい回答ありがとうございます。 すごい分かりやすかったです。

その他の回答 (1)

  • CrystalT
  • ベストアンサー率42% (30/70)
回答No.1

E000を2進数で表現すると、 1110 0000 0000 0000 (あってます!) で、これがどのような数を示しているかというと2の補数なので ビットを反転させて(1の補数) 0001 1111 1111 1111 1を加える 0010 0000 0000 0000 符号はマイナスだったので、つまり-8192だった訳です。 これを4倍すると、-32768、これは16ビットの2の補数表現 で表現できる数の範囲 +32767(0111 1111 1111 1111)から -32768(1000 0000 0000 0000)に入ってます。 DFFFだと同様に 1101 1111 1111 1111で1の補数は 0010 0000 0000 0000 2の補数は 0010 0000 0000 0001 つまり、-8193ですよね。 4倍すると、-32772で、これは16ビットの2の補数表現 で表現できる数の範囲からあふれてしまいます。

kimosu
質問者

お礼

あふれについてよく分かりました。慣れないと難しいですね。 ありがとうございます。

関連するQ&A