CodeZine(コードジン)

特集ページ一覧

シフト演算

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/09/29 14:00

目次

シフト演算のちょっとあぶない話

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

図32:2ビットシフトに改造してみる
図32:2ビットシフトに改造してみる

 ビルドして、エラーがなければ[ディバグ」を選びますと、SM+に新しいプログラムがロードされます。先ほどと同様に、まずはローカル変数ウィンドウを2進数表示にして1行ずつ実行してみてください。2ビットシフトの行では、1のある桁が一気に2桁移動するのがわかると思います。そして最後の行を実行し終わると、図33のように最上位ビットが1になって終わります。

図33:すべてのシフト演算を終えた状態
図33:すべてのシフト演算を終えた状態

 リセットアイコンをクリックして、もう一度最初から実行してみてください。今度はローカル変数ウィンドウは16進数表示のままで。0x01から始まって、0x04、0x10、0x40、と値が変化し、最後は図34のように0x80で終わります。

図34:プログラム終了時、16進数表示の場合
図34:プログラム終了時、16進数表示の場合

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

図35:プログラム終了時、10進数表示の場合
図35:プログラム終了時、10進数表示の場合

 え~!?っと思った方は、前々回の最初のプチ解説を読んでみてください。そうです、符合付き変数の場合は、最上位ビットが正か負かの符合を表すのでしたね。このことを知らずにシフト演算子を使うと、思わぬ不具合を作り込んでしまうことがあります。シフトに限らず、論理演算系は慣れてくると非常に便利な演算子ですが、このような危険性も持っていることを知っておきましょう。テストをするときも、ここで紹介したように10進数で表示していないと気づきにくいという問題もあります。

プチ解説

 論理演算をする場合は、符合を持たない変数型を使う方が安全(不具合を作りこみにくい)です。変数に符合を持たせないようにするには、変数型の前にunsigned(アンサインド)という修飾子をつけます。

 たとえば符合のあるcharに対して符合のないのはunsigned charとなります。unsigned char型は、8ビットで正だけの整数を表しますので、扱える数値の範囲は0から255(0xff)です。

 intも同様に、符合なしのものはunsigned intと表記し、扱える数値の範囲は0から65535(0xffff)です。

 ためしに、最後のプログラムの変数aの型をcharからunsigned charに変えて実行してみてください。10進数表示でも、図36のように、ちゃんと?正の128となるはずです。

図36:符合なしの変数の場合の最終結果
図36:符合なしの変数の場合の最終結果

 SM+は、終了時に環境をプロジェクトファイルに保存するか聞いてきます。ここでは[[はい(Y)]をクリックして終了させてください。

 ※間違って「いいえ(N)」を選んでも壊れたりはしないので安心してください。その代わり、次回起動時に再度設定画面が表示されますから、先に述べた設定の操作が必要になります。

 今回はここまでです。次回はシミュレータでLEDを点灯させて論理演算について理解を深めます。そして、論理和と論理積も学習します。

 それではまた。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:たった5つのルールではじめるC言語開発

もっと読む

著者プロフィール

  • 舘 伸幸(タチ ノブユキ)

    NECマイクロシステム株式会社 勤務 NPO法人SESSAME 所属 開発ツールのソフトウェア開発を経て組込みソフトウェア開発に従事。プライベートにも半田ごては手放さない。 2006年からSESSAME に参加。若い世代に物を作る楽しさを伝えていきたい。

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5