Mam następujący kod C:Język C: wartość #DEFINEd powoduje 8-bitowe mnożenie. Czemu?
#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);
Jeśli mogę skompilować to (przy użyciu kompilatora platformy MSP430, za niewielką wbudowaną OS o nazwie contiki) wynik jest 0, a ja spodziewałem 191. (uint8_t jest typedef” ed jako unsigned char)
Gdybym go zmienić na:
uint8_t a = 3;
uint8_t b = 4;
uint8_t c = 255;
uint8_t prr;
prr = (c * a)/b;
printf("prr: %u\n", prr);
działa poprawnie i drukuje 191.
Skompilowanie prostej wersji tego "normalnie" przy użyciu gcc na systemie Ubuntu wyświetla prawidłową wartość w obu przypadkach.
Nie jestem do końca pewien, dlaczego tak jest. Mogłem go obejść, przypisując wcześniej wartość DEFINED do zmiennej, ale wolałbym tego nie robić.
Czy ktoś wie, dlaczego tak jest? Być może z linkiem do jakiegoś więcej informacji na ten temat?
Z pewnością spodziewałbym się wydrukować 191. W drugim przypadku pierwsze c i a są promowane do int niezależnie, więc ich mnożenie nie może przepełnić. To samo dzieje się w pierwszym przypadku (chociaż PRR_SCALE jest już int - ale to nie zmieni również promocji dla int). twój gcc na twoim polu zachowuje się dokładnie dobrze. –
sprawdź, czy posiadasz nagłówek stdio.h. Wiem, że jeden kompilator dla msp430 pozwala na deklaracje funkcji domniemanych: w takim przypadku wywołanie printf spowodowałoby niezdefiniowane zachowanie, a wynik "0" zostałby wyjaśniony w ten sposób. tylko moje dwa centy. nie myśl, że to jest warte odpowiedzi :) –
@litb: stdio.h jest wliczony w cenę. – Rabarberski