C言語今更再認識: char型変数は0~0xffではない | 技術日誌

技術日誌

ここでは,電子工作,木工などの趣味での記録を書いています。
なお当初はKMK研究所のメインテーマであるSPSのノウハウを書いてきましたが,順次SPSノウハウのページに複製を作っていきます。

 今開発中のプログラムをテストしているときに思ったように動かないことが起こりました。rに0xffが代入されているはずなのに,それを0xffと比較しても,等しくないということになってしまいました。これは今更再認識させられた事柄です。

 char型変数は1バイト8ビットの変数ですから,2進では00000000~11111111まで表せます。11111111は16進では0xffです。このことを前提に下のプログラムを実行してみます。r=0xffならtrueと出力されるはずです。

  char r=0xff;

  if( r==0xff ){

    printf("true\n");

  }else{

    printf("false\n");

  }

 実行結果はfalseです。rに0xffを代入して,0xffと比較しているのに,等しくないという結果です。不思議です。理由は,型宣言のcharは,符号付き変数で,2進で10011011のように一番上の桁が1の数は負の数とする約束があるのです。すなわち,rは-1なのです。それと0xff(10進で255)を比較しているので,true(真)とはならなかったわけです。思ったように動作させるには,一行目を

unsigned char r=0xff

としなければなりません。unsignedは「正の数だけ」という宣言なので,2進の一番上の桁が1であっても負の数とは扱われません。これでrが0から255までの整数を扱えます。