- ベストアンサー
論理シフトについて
コンピュータの論理シフトについて質問があります。 シフトしてオーバーフローした場合は、コンピュータ内部においては演算結果が反映されているのでしょうか? 例えば、8ビット表記で (10100001)_2 =(161)_10 で左に一桁シフトしたとすると (01000010)_2 =(66)_10 という表記になると思うのですが、このようなシフトをすると値が小さくなってしまう という考え方をすればいいのでしょうか? 回答よろしくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
シフトしてオーバーフローした場合は、コンピュータ内部においては演算結果が反映されているのでしょうか? 演算結果が反映されているか? ★回答 工学的に人為的に製作者により決定される 製作された言語 アプリ の仕様で決まるのが正解である メーカー によりちがう 仕様どうり コンピュータ内部においては演算結果が反映されている ★回答 説明 演算結果を制限するものは 以下であり ソフトでそれを解消して仕様を決める (1)デジタルコンピューター(マイコン DSP その他全部)のレジスターの仕様 メモリー仕様 (2)そのデジタルコンピューター上で走らせるソフト アプリ 任意多倍長計算が可能なのもあるわけ 商用の数式処理システムとしては Maple や Mathematica その他が可能 言語はその仕様に有効数字が記載されてる (3)アプリは 言語アプリで作成されるのでその仕様で決まる 言語はその仕様に有効数字が記載されてる アセンブラは マシン語 に近い仕様がほとんどだ ※注意 ちゃんとマニュアルに書いてあるはずだ ★推定法は以下でOK たとえば 仮数部は 0.5^推定有効bit数-1 を計算させてみると 言語仕様は推定可能 -1が出たらそこが限界だ たとえば49bitで -0.999999999999998000000000000000 たとえば50bitで -0.999999999999999000000000000000 たとえば51bitで -1.000000000000000000000000000000 となる たとえばエクセルはそうなる
その他の回答 (3)
- unagi2
- ベストアンサー率33% (10/30)
>コンピュータ内部においては演算結果が反映されているのでしょうか? 意味がよくわかりませんが、機械語/アセンブリ言語のレベルだと、 シフト命令実行後に「キャリーフラグ」などと呼ばれるフラグが立つように、 大抵は作られています。よほど低機能なCPUでもない限り。 その後、仕様に応じたソフトウェア処理を行えばいいです。 多桁のシフトを実現したいなら上位桁にシフトインするように処理すればいいし、 オーバーフローが生じ値が不正確な事を警告するだけならそうすればいいし。 特に何も必要ないなら何もしなければいいし。 >値が小さくなってしまうという考え方 空位である"0"がシフトアウトされたり数値"0"が上の桁に移動しても何も起こってないのと 同じですが、 "1"だとそうはいきません。 8bitで表現できる範囲を越えてしまったのですから、8bitだけで表現してももはや不正確です。 というか、押し出され失われた分が、数値ならばちょうど分小さくなります。 余談ですが、1bit左シフトすることは数値を2倍する事と実は同じです。 (10進数でも1桁左シフトし(て最下位に"0"を付加することを「10倍する」といいます)
お礼
回答ありがとうございました。
- TooManyBugs
- ベストアンサー率27% (1472/5321)
>このようなシフトをすると値が小さくなってしまうという考え方をすればいいのでしょうか? しても良いし、しなくても良い。 10100001が01000010に変化したのをどのように捉えるかはその目的次第。 ビットの変化はハードウエアの世界だがそれをどのような意味づけするかはソフトウエアの世界。
お礼
回答ありがとうございます。結局は、ものによって考え方が違うことなのですね
- ok-kaneto
- ベストアンサー率39% (1798/4531)
「オーバーフロー」なので「上位ビットは切り捨て」られます。 なので「値は小さくなります」ですね。 ただし最上位ビットが符号の場合は左シフトでもマイナスからプラスになる場合は大きくなりますね。
お礼
回答ありがとうございました
お礼
基本情報技術者試験の参考書ではそのような内容が書いていなかったのですが納得いきました。回答ありがとうございました