Код
void main(void)
{
volatile int a = 200;
volatile int b = 300;
volatile long c = a*b;
}
{
volatile int a = 200;
volatile int b = 300;
volatile long c = a*b;
}
AVR IAR (v5.11B) сначала делает умножение 16*16=16 бит и только после этого расширяет результат до 32х бит. При чем если оба операнда типа int, расширение до 32х бит осуществляется со знаком. А если хотя бы один из них - unsigned - то в 16 старших бит просто дописываются 00.
Поэтому возник вопрос - как "правильно " сделать умножение без обрезки результата?
Подозреваю, что это вполне корректное поведение С-компилятора, которое обусловлено какими-то стандартами. Поэтому хотелось бы еще и узнать, где можно доступно почитать об подобных особенностях компиляторов. И одинаковы ли данные особенности под 8-ми, 16-ти и 32-двухбитные платформы.