シフト演算のちょっとあぶない話
再びPM plusに戻って、今度はlogictest.cを図32のように書き換えてみてください。SM+は終了させなくてOKです。いままで1ビットずつのシフトだったものを、最初の3回だけ2ビットシフトに変えます。

ビルドして、エラーがなければ[ディバグ」を選びますと、SM+に新しいプログラムがロードされます。先ほどと同様に、まずはローカル変数ウィンドウを2進数表示にして1行ずつ実行してみてください。2ビットシフトの行では、1のある桁が一気に2桁移動するのがわかると思います。そして最後の行を実行し終わると、図33のように最上位ビットが1になって終わります。
リセットアイコンをクリックして、もう一度最初から実行してみてください。今度はローカル変数ウィンドウは16進数表示のままで。0x01から始まって、0x04、0x10、0x40、と値が変化し、最後は図34のように0x80で終わります。

では、もう一度リセットアイコンをクリックして最初から実行します。今度はローカル変数ウィンドウの表示を10進数表示にして実行してみてください。1から始まって、4、16、64と変化していき、そして最後の1行を実行すると・・・なんと-128と、突然負の値になってしまいました!(図35)。

え~!?っと思った方は、前々回の最初のプチ解説を読んでみてください。そうです、符合付き変数の場合は、最上位ビットが正か負かの符合を表すのでしたね。このことを知らずにシフト演算子を使うと、思わぬ不具合を作り込んでしまうことがあります。シフトに限らず、論理演算系は慣れてくると非常に便利な演算子ですが、このような危険性も持っていることを知っておきましょう。テストをするときも、ここで紹介したように10進数で表示していないと気づきにくいという問題もあります。
論理演算をする場合は、符合を持たない変数型を使う方が安全(不具合を作りこみにくい)です。変数に符合を持たせないようにするには、変数型の前にunsigned(アンサインド)という修飾子をつけます。
たとえば符合のあるcharに対して符合のないのはunsigned charとなります。unsigned char型は、8ビットで正だけの整数を表しますので、扱える数値の範囲は0から255(0xff)です。
intも同様に、符合なしのものはunsigned intと表記し、扱える数値の範囲は0から65535(0xffff)です。
ためしに、最後のプログラムの変数aの型をcharからunsigned charに変えて実行してみてください。10進数表示でも、図36のように、ちゃんと?正の128となるはずです。
SM+は、終了時に環境をプロジェクトファイルに保存するか聞いてきます。ここでは[[はい(Y)]をクリックして終了させてください。
※間違って「いいえ(N)」を選んでも壊れたりはしないので安心してください。その代わり、次回起動時に再度設定画面が表示されますから、先に述べた設定の操作が必要になります。
今回はここまでです。次回はシミュレータでLEDを点灯させて論理演算について理解を深めます。そして、論理和と論理積も学習します。
それではまた。


