SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

シフト演算


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

 再び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を点灯させて論理演算について理解を深めます。そして、論理和と論理積も学習します。

 それではまた。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
たった5つのルールではじめるC言語開発連載記事一覧

もっと読む

この記事の著者

舘 伸幸(タチ ノブユキ)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3726 2009/03/26 18:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー