適用先: ARM 開発ツール
回答
この記事に含まれている情報の適用先:
- RealView Compiler の全バージョン
- GNU Compiler の全バージョン
- CARM Compiler の全バージョン
質問
以下のコードを Keil C51 Compiler から移植しています。
volatile unsigned char uc1, uc2;
void test (void) { uc1 = 0x69; uc2 = 0x96;
if (uc1 != ~uc2) { uc1 = 0; // この行は実行されない } }
2 項 NOT 演算(~)で ARM Compiler による間違った結果が与えられているようです。何が悪いのでしょうか?
回答
ARM アーキテクチャは 32ビット CPU であり、すべての演算は ANSI 規格に適合する 32ビット数で実行されます。したがって、~uc2 の値は 0xFFFFFF69 であり、0x69 ではありません。
C51 Compiler 上で、この演算は 8 ビットで実行されるため、予想待通りの結果が得られます。この問題の解決策は、陽的キャスト演算を使用することです。
if ((unsigned char)uc1 != (unsigned char)~uc2)
関連項目
- GENERAL: #DEFINES WITH ARITHMETIC DON'T WORK
- GENERAL: #DEFINE GENERATES WRONG RESULTS
- C251: POINTER ARITHMETIC DELIVERS UNEXPECTED RESULTS