tengo el siguiente código C:Lenguaje C: el valor #DEFINEd estropea la multiplicación de 8 bits. ¿Por qué?
#define PRR_SCALE 255
...
uint8_t a = 3;
uint8_t b = 4;
uint8_t prr;
prr = (PRR_SCALE * a)/b;
printf("prr: %u\n", prr);
Si puedo compilar este (utilizando un compilador plataforma msp430, para un pequeño sistema operativo integrado llamado contiki) el resultado es 0, mientras que esperaba 191. (uint8_t es typedef' ed como un unsigned char)
si la cambio a:
uint8_t a = 3;
uint8_t b = 4;
uint8_t c = 255;
uint8_t prr;
prr = (c * a)/b;
printf("prr: %u\n", prr);
funciona correctamente y grabados 191.
Al compilar una versión simple de este 'normalmente' utilizando gcc en un cuadro de Ubuntu se imprime el valor correcto en ambos casos.
No estoy exactamente seguro de por qué es esto. Podría eludirlo asignando el valor DEFINEd a una variable de antemano, pero preferiría no hacerlo.
¿Alguien sabe por qué es esto? Tal vez con un enlace a más información sobre esto?
espero que ambos impriman 191. en el segundo caso, la primera cy a se promueven a int de manera independiente y por lo tanto su multiplicación no puede desbordarse. Lo mismo sucede en el primer caso (aunque allí, PRR_SCALE ya es int, pero eso no cambiará la promoción de a a int tampoco). tu gcc en tu caja se comporta exactamente bien. –
compruebe que tiene el encabezado stdio.h incluido. Sé que un compilador para msp430 permite declaraciones de funciones implícitas: si ese es el caso, la llamada a printf causaría un comportamiento indefinido, y el resultado "0" se explicaría de ese modo. solo mis dos centavos. no creo que valga la pena una respuesta :) –
@litb: stdio.h está incluido. – Rabarberski