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 параметр командной строки.