Kolejność obliczeń jak zauważył wyżej Malutki_27 to jedna i bardzo ważna rzecz. Ale niezrozumienie tego zagadnienia bierze się tutaj z jednej prostej przyczyny.
Dokąd nie przestawisz się na myślenie o rozpatrywaniu w C każdej najmniejszej operacji jako .... uwaga! .... WYRAŻENIA dotąd będziesz miał kłopoty z tym.
bo co to jest?
Kod:
pulse*weg
????
to jest wyrażenie
Kod:
(pulse*weg)
tak na prawdę składa się ono z dwóch mniejszych wyrażeń
Kod:
(pulse) * (weg)
a całe działanie to mnożenie wyniku tych dwóch wyrażeń czyli
Kod:
( (pulse) * (weg) )
jak spojrzymy na to przez ten pryzmat to chyba nie trudno zauważyć, że jeśli dodamy kolejną zmienną
Kod:
pulse*weg*dist
to będziemy mieli - no właśnie ile wyrażeń ?
zagadka
pokażę to nawiasami:
Cytuj:
( ((pulse)*(weg)) * (dist) )
no i co ?
to chyba logiczne zgodnie z kolejnością działań rozpatrujemy wartości każdego wyrażenia i to dokładnie będzie miało odzwierciedlenie w kodzie asemblera. Czyli ja tu widzę konieczność wyliczenia 5 wyrażeń - zgadza się?
w związku z tym jeśli mamy działanie teraz z dzieleniem
Kod:
(pulse*weg*dist) / (pulse*1000UL)
to czy nie zaczyna już być to jasne jak drut ? po co się zastanawiać czy trzeba pisać
Kod:
pulse*1000UL
czy może
Kod:
1000UL*pulse
toż to nie będzie miało ŻADNEGO znaczenia w związku z tym co napisałem wyżej.
odnośnie ostatniego stwierdzenia że w działaniu
Kod:
Dist += ((WEG*wheel) / pulses);
nie działa rzekomo wstawienie hmmm poprawnie mówiąc wykonanie rzutowania do typu uint32_t - jest nieprawdą. Coś ci może się już pomyliło w trakcie tych prób. Nie mam akurat teraz pod ręką zestawu uruchomieniowego więc musiałem skorzystać z "obrzydliwego"
symulatora pod AS6 .... więc proszę bardzo - najpierw bez żadnego rzutowania i zły wynik - zgadza się ? spójrzmy:
a teraz po kolei dwa rodzaje rzutowania jedno z użyciem 1UL a drugie z użyciem (uint32_t)
i jak widać wartość na końcu obliczona jest taka sama
------------------------ [ Dodano po: 1 minucie ]reasumując - jeśli mnożymy 3 liczby
Kod:
32UL * pulse * dist
w taki sposób, to na podstawie powyższych rozważań pierwsze wyrażenie z uwagi na użyte rzutowanie już będzie miało wynik uint32_t dlatego mnożenie *dist już także będzie promowane do uint32_t
_________________
zapraszam na blog:
http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj
Kurs EAGLE ] [ mój kanał YT TV
www.youtube.com/mirekk36 ]