Ho il seguente codice C:linguaggio C: il valore #DEFINEd compromette la moltiplicazione a 8 bit. Perché?
#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);
Se compilo questo (usando un compilatore piattaforma MSP430, per un piccolo sistema operativo embedded chiamato contiki) il risultato è 0, mentre mi aspettavo 191. (uint8_t è typedef' ed come un unsigned char)
se 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);
funziona correttamente e stampe 191.
01.235.La compilazione di una versione semplice di questo 'normalmente' utilizzando gcc su una casella Ubuntu stampa il valore corretto in entrambi i casi.
Non sono esattamente sicuro del motivo. Potrei aggirarla assegnando in anticipo il valore DEFINEd a una variabile, ma preferirei non farlo.
Qualcuno sa perché questo è? Forse con un link ad altre informazioni su questo?
mi aspetterei che entrambi stampino 191. nel secondo caso, prima c e a vengono promossi a int indipendentemente e quindi la loro moltiplicazione non può eccedere. Lo stesso accade nel primo caso (anche se lì PRR_SCALE è già int - ma non cambierà nemmeno la promozione di a in int). il tuo gcc sulla tua casella si comporta esattamente bene. –
controlla di avere l'intestazione stdio.h inclusa. so che un compilatore per msp430 non consente dichiarazioni di funzioni implicite: se questo è il caso, la chiamata a printf causerebbe un comportamento indefinito, e il risultato "0" sarebbe spiegato in tal modo. solo i miei due centesimi. non credo che valga la pena di rispondere :) –
@litb: stdio.h è incluso. – Rabarberski