磁気センサーの改良
C言語の整数
AVRを使った磁気センサーのプログラムをいろいろと改良していたのだが、ときどき変な挙動をする。この原因を調べていたが、いくつか原因があったが、絶対値を計算するときにうまくいっていなかったのが、一番大きな原因だった。例えば、絶対値を求めるには次のような関数を書いたとする。
char abs(char v){ if(v<0){v=-v;} return v; }
しばらく機械語から遠ざかっていたので、気がつくのが遅れたが、これではうまくいかない場合がある。charでは、-128から127までの整数を表現することができる。そして、マイナスをつけるときには、0x100-vという計算がされる。-128は0b10000000と表現されるが、これにマイナスをつけると、0b10000000となり、128ではなく-128となってしまう。つまり、-128以外はうまく働くが、-128だけはダメなのだ。まあ、少しずつCを思い出していこう。