質問: [2][2] ---------------------------------------- ご覧の通り、char型変数に値を入力しているために、forループで i がきちんとインクリメントされません。 入力値は -128~127 の値しか想定していないので、メモリの消費を少しでも抑えようと思いchar型で宣言したのですが、思わぬ所でおかしな挙動が起こってしまいました。 int型で宣言すればいいだけなのですが、なぜこんな挙動になるのか知りたいです。 よろしくお願いします。
回答: 4バイト単位のメモリアクセスをする32bitcpuを考えます。 1バイト単位では読み込みはできないので、c言語風に書くと char c = memory[1] ; /* 1バイト目の1バイト分のデータを取り出す */ としたい場合には int a=memory[0] ; /* 0~3バイト目を取り出す */ a >>= 8 ; /* 1バイト目にあたる部分を最下位へシフトする(リトルエンディアンの場合) */ char c = a & 0xff ; /* 余分なビットを0に消去する */ と、intなら1命令で済むところを3命令必要です。 cpuによっては、1命令で実行できる場合もあるし、実際に上のような3命令必要なものもあります。 また、1命令でできるの場合でも、intと同じ時間で実行できるものもあれば、内部で上のような処理をしていてintより長い時間がかかるcpuもあります。 また、コンパイラの種類やオプションによって、積極的に1命令のを使ったり、逆に(互換性等を考えて)1命令のものは使用しなかったり、します。 使用メモリ量は、たしかに考えなければなりません(特に、制限の多い組込みの分野では) しかし、ターゲットcpuやコンパイラの特性、ソフトのパフォーマンス等を十分に知った上で行わないと、節約した積もりが、かえって消費していた、ということになります。