Skróci³em program do minimum i nadal ¼le dzia³a:
//program testowy #include
void main(void) { unsigned char y = 5; unsigned long x = 56789;
x-=(y*10000); }
W x powinno byæ po dzia³aniu 6789 a jest 72325 O co tu chodzi!
Pozdrawiam EM
Skróci³em program do minimum i nadal ¼le dzia³a:
//program testowy #include
void main(void) { unsigned char y = 5; unsigned long x = 56789;
x-=(y*10000); }
W x powinno byæ po dzia³aniu 6789 a jest 72325 O co tu chodzi!
Pozdrawiam EM
Proponuje zrobiæ dodatkow± znmienn± temp dla dzia³ania: temp = y*10000 Potem zrobiæ x-=temp. Potem zobaczyæ dok³adnie które dzia³anie jest ¼le wykonywane.
-- Marcin.
U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgalio$ssp$ snipped-for-privacy@news.onet.pl...
Witam! Nie wiem dok³adnie w czym problem ale wyliczony wynik to 2^16 + 6789. Za problem s± pewnie odpowiedzialne niejawne kontersje typów, szczególnie z unsigned char na jaki¶ inny. Spróbuj rozbiæ t± operacjê na dwie: najpierw * potem -= i zobacz gdzie pojawia siê z³y wynik. Mo¿esz te¿ spróbowaæ tak: x -= ((unsigned long)y * 10000); To pewnie pomo¿e ale nie da odpowiedzi dlaczego wystêpowa³ b³±d. Napisz co z tego wysz³o. Sam nie u¿ywam AVR-GCC ale mam trochê do¶wiadczeñ z komputerów PC... Pozdrawiam Wojtek
Jak siê teraz domy¶lam wsytêpuje rzeczywi¶cie jaki¶ b³±d w konwersji typów. Czyli zawsze jak u¿ywam dzia³añ arytmetycznych powinienem pilnowaæ siê typów? Przytoczony przyk³ad dzia³a ok. Dziêkujê za szybkie podpowiedzi i pozdrawiam. EM
Tutaj jest mno¿enie liczb ca³kowitych wiêc trudno siê spodziweaæ zafa³szowania wyniku poprzez utratê czê¶ci u³amkowej... Tak mi siê wydaje Pozdr EM
U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgalio$ssp$ snipped-for-privacy@news.onet.pl...
Tu z kolei przekraczasz zakresy zadeklarowanych zmiennych co prowadzi do nieprzewidywalnych rezultatów. C nie uprzedza o tym i trzeba siê pilnowaæ. Jak zrobisz x -= ((unsigned long) y * 10000); to wyjdzie dobrze.
-- Pozdrowienia Jurek Szczesiul
U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgapa1$8sv$ snipped-for-privacy@news.onet.pl...
Z typami nale¿y uwa¿aæ. Zwykle jest tak, ¿e wynik operacji (np. u Ciebie mno¿enia y * 10000) jest takiego typu jak pierwszy operand (czyli u Ciebie unsigned char ) i nie jest to b³±d a po prostu cecha jêzyka C. W przytoczonym przyk³adzie kompilator zachowa³ siê jeszcze inaczej i byæ mo¿e to zachowanie to jest b³êdne lub przynajmniej "niestandardowe".
No to siê cieszê.
Pozdrawiam równie¿ Wojtek
U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgapik$9lf$ snipped-for-privacy@news.onet.pl...
Kolega Jerzy mia³ z pewno¶ci± na my¶li Twój pierwszy przyk³ad... Wojtek
Akurat tam chodzi o odrzucenie czê¶ci u³amkowej...
mno¿enia
char )
Próbowa³em jeszcze x -= (10000*y);
Ale tak te¿ nie jest dobrze EM
Jeszcze jedna my¶l Najgorsze jest to, ¿e przyk³ad zaci±gn±³em z jakiego¶ gotowego pliku
/*********************************************************** * Program: LCD driver * Created: 28.8.99 21:32 * Author: Brajer Vlado * snipped-for-privacy@kks.s-net.net * Comments: HITACHI LCD driver ************************************************************/
Trzeba czasmi uwa¿aæ, co siê wykorzystuje... Pozdr EM
U¿ytkownik "Wojtek" napisa³ w wiadomo¶ci news:bgaogn$9g0$ snipped-for-privacy@atlantis.news.tpi.pl...
6789.szczególnie z unsigned char na jaki¶ inny.
gdzie pojawia siê z³y wynik.
W zasadzie to wiadomo : avr-gcc gdy warto¶æ siê nie zmie¶ci³a uzy³ domyslnego typu int, wpisanie tam po¶redniego 50000 czyli 0xC350 zostaje interpretowane ( najstarszy bit okre¶la znak ) jako
-(~0xc350 + 1) = - 15536 i wtedy rzeczywi¶cie 56789 - (-15536) = 72325
-- Pozdrowienia Jurek Szczesiul
U¿ytkownik "Jerzy Szczesiul" napisa³ w wiadomo¶ci news:bgarv0$f1q$ snipped-for-privacy@nemesis.news.tpi.pl...
Zgadza siê. Tak w³a¶nie musia³o siê staæ. Wojtek
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.