2013年9月1日日曜日

if (code[2] != (uint8_t)~code[3])などとキャストが必要の件

NECフォーマットの赤外線リモコンでは8bitのデータコードと、そのビット反転したものが送られてくる。なのでavr-gccで掲題のようなチェックをしたのだが、もともとはキャストしておらず常に不一致でおかしいなぁ〜と悩んでいた。
プログラム全体が一通りできたところで、いよいよ原因究明しようと逆アセンブリの該当部分を見ると案の定16bitにプロモートされたうえでビット反転されている。たとえば0x89と0x76が送られてきて0x0089と、0x0076のビット反転すなわち0xff89の比較となり、不一致となっていた。
前からシフトとかビット演算が必要ないのに16bitで行われていて、C言語の仕様だからしかたないけど命令数無駄だよなぁ〜と思っていたのだが、ちょっとこの結果は想定外で驚いた。gccの場合、こういった共通の言語仕様はコンパイラーの共通部というか、直しにくいところに実装されているそうで、随時キャストでしのぐしかないようだ。

0 件のコメント:

コメントを投稿