КажиСЯ я понял логику компиля... вернее - компилерописателей...
В этом случае -
Код: Выделить всё
uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & 0xffff0000);
раз переменная temp - 32-х разрядная, то и константа подтягивается автоматом к 32-м разрядам (та скать - автоматическое приведение типа) и результат нормальный...
В этом случае -
Код: Выделить всё
uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0x0000ffff << 16));
сначала вычисление происходит со сдвигом константы, а она как выяснилось по умолчанию 16-ти разрядная... указатель сдвига тоже обычный, следовательно никакого приведения к 32-м разрядам не происходит... и мы благополучно теряем FFFF... остается чистый 16-ти разрядный нолик...
Потом уже вычисляется &, и естественно правый 16-ти разрядный нолик приводится к 32-м разрядам... но вот незадача, сколько нолик не приводи, он так и остается ноликом )))
В итоге - то что имеем...
PS.
Ой... пока писал,
ARV уже практически все объяснил...
PPS.
Хотя... внимательнее ваше объяснение почитал, помоему у меня более правдоподобно

...