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 будет выполнять арифметические операции с размером наибольшего операнда, даже если оба операнда меньше целого числа. Поведение, требуемое ISO, можно установить с помощью параметра командной строки -Oi.
r = c ^ poly;
илиr = (0) ^ poly;
? Вы пробовали переключатель-Oi
, как это предлагается в руководстве? - person Adam   schedule 23.05.2011-Oi
и жалуйтесь поставщику вашего компилятора, что его компилятор не работает по умолчанию... - person R.. GitHub STOP HELPING ICE   schedule 23.05.2011r = (c << 7) ^ poly
r
равно 7. - person AndreKR   schedule 23.05.2011