Yo he pasado bastantes rabias con el PCWH Compiler sobre todo con el manejo de memoria dinamica y con operaciones
de multiplicacion entre int8 e int32. He oido que el c18 es mejor pero nunca lo he usado.
El C18 anda bien pero las 'integer promotions' que es eso que mencionas tu, es un tema que hay que leerlo. Hasta donde sé, por defecto no las hace automáticamente.
Esto es algo comun en los compiladoes de C para microcontroaldores, al menos en los que he visto.
La integer promotion se da casualmente cuando queremos multiplicar o dividir variables que son de diferente orden como mencionas. Entonces hay que decirle al compilador explicitamente que queremos que haga todo en int16, por citar un ejemplo
Entonces si tenemos (en C18)
int a = 2;
unsigned char b = 4;
int c;
c = a * b ; // esto no funciona o mejor dicho puede dar resultado erróneo
c = a * (int) b; //esto si funciona
Te sugiero te fijes que dice tu compilador sobre las 'integer promotions' asi le llaman.
saludos