unsigned char a, b;
unsigned i;
a = b = 0x80;
i = a + b; /* ISO requires that i == 0x100, but in C18 i == 0 */
Si lo saben y lo mantienen, ellos sabrán porqué.
En el caso de la multiplicación, está claro que el asm devuelve 16bit cuando se realiza 8bit x 8bit.
Perder a propósito esa precisión es una tontería.
178: mul = a * b;
0110 51E6 MOVF 0xe6, W, BANKED
0112 03E4 MULWF 0xe4, BANKED
0114 CFF3 MOVFF 0xff3, 0xef
0116 F0EF NOP
Y termina con CLRF a la parte alta de la variable mul.
¿Porqué? si casi cuesta lo mismo cargar PRODH en la parte alta de mul.
Saludos.