Mam kod, który działa odmiennie od GCC i Atmel studio:C ekspresji oceny inaczej w dwóch różnych kompilatorów
uint32_t tc = 107900;
int8_t m = 59;
tc = tc - (m*1800);
na GCC, wynik w tc
1700, zgodnie z przeznaczeniem.
W AtmelStudio wynik tc
wynosi 132772, co nie jest poprawne.
Problem polega na tym, że termin m*1800
jest obliczany z ograniczoną precyzją m przy użyciu AtmelStudio.
Moje pytanie brzmi, który kompilator robi to poprawnie?
Dziękuję.
Wyobrażam sobie, że rzutowanie 'm' na' uint32_t' w wyrażeniu (np. 'Tc = tc - ((uint32_t) m * 1800)') dałoby pożądane wyniki, ale nie jestem pewien, czy jest to wymagane według specyfikacji języka C. –
... lub użyj '(m * 1800L)', ponieważ produkt arytmetyczny 59 * 1800 nie mieści się w _minimum_ C określonym zakresie 'int' od -32767 do +32767, ale pasuje do _minimum_ C określonego' long' zasięg. – chux
Oczywiście ten kompilator domyślnie używa 16-bitowych liczb całkowitych. Oczekiwane zachowanie. –