Цитата(MrYuran @ Sep 22 2009, 12:37)

400 * 7800 = 3120000
Как по-вашему, укладываемся в char?
Почему в char?
Как минимум в unsigned int.
Цитата
И вообще, нафига какие-то приведения, когда сплошные константы?
unsigned char Tmpr = 235 - 400UL * 7800 / 14200; // = 16
Ну написал же: "... тестовый пример...". В реальности там переменные стоят...
Цитата
Вменяемый компилятор должен подставить результат на уровне препроцессорной обработки
Ясное дело, что с константами операции выполнятся на этапе препроцессорной обработки...
Речь не об этом...
Цитата(Сергей Борщ @ Sep 22 2009, 13:09)

Потому что существуют правила языка. Компилятор выбирает конкретную функцию вычисления исходя из разрядности операндов. Вы же хотите, чтобы в коде
Код
uint8_t a =2; b = 3; uint32_t c = a * b;
компилятор использовал 32-битное умножение?
По поводу правил уже догадался, поэкспериментировав

Т. е., как минимум один из операндов должен иметь тип unsigned long...