volatile uint16_t r;
unsigned char poly = 0x07;
unsigned char c = 0;
r = (c << 8) ^ poly;
Linux で gcc を使用してコードをコンパイルするとr
、7
.
同じコードを Microchip C18 でコンパイルするとr
、0
.
なんで?
それを次のように変更すると:
volatile uint16_t r;
uint16_t poly = 0x07;
uint16_t c = 0;
r = (c << 8) ^ poly;
r
7
もC18になります。
C18 のマニュアルに整数昇格に関するセクションがありますが、私の質問とは関係ないと思います。とにかく、ここにあります:
ISO は、すべての演算を int 精度以上で実行することを義務付けています。デフォルトでは、MPLAB C18 は両方のオペランドが int より小さい場合でも、最大のオペランドのサイズで演算を実行します。ISO で義務付けられている動作は、-Oi コマンドライン オプションを使用して設定できます。