質問: 問:負数を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の補数で表現』の部分がないように思えます。この辺りも知りたいです。 問題の解き方についても疑問があります。 での回答では、 イ DFFF →(シフト前)1101 1111 1111 1111 →(シフト後)0111 1111 1111 1100 先頭ビットが1から0に変わったので「桁あふれ」。 問題集の回答ではこっちで説明されていました。 の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の補数を使用していなかったので、疑問に思っています。 頭が混乱しております・・・。 回答宜しくお願い致します。
回答: 質問文の中で紹介されていた > の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)なら負数であると判断できます。よって, > 符号付きでない場合は、上記はすべて正の数と言う事で合ってますか? 合っています。