Почему здесь uint16_t имеет значение?

volatile uint16_t r;
unsigned char poly = 0x07;
unsigned char c = 0;

r = (c << 8) ^ poly;

Когда код компилируется с помощью gcc в Linux, 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. ИСО требует поведение может быть установлено через -Oi параметр командной строки.

13
задан Jeff Mercado 23 May 2011 в 00:10
поделиться