Witam! Mam problem - wydawa³oby siê doœæ g³upi... Mam zmienn¹ oœmiobitow¹ (unsigned char) i chcê sprawdziæ stan trzech najm³odszych bitów. Je¿eli napiszê tak: if ( i & 7 ) to kompilator najpierw promuje zmienn¹ na int (16 bit) i siódemkê te¿ trakuje jako int - ok, tak jest w standardzie C, nie bêdê go zmienia³. Jednak jeœli napisze tak if ( (unsigned char) ( i & 7 ) ) albo tak: if ( i & (unsigned char) 7 ) czy nawet tak if ( (unsigned char) ( (unsigned char) i & (unsigned char) 7 ) ) to wynik kompilacji i tak jest identyczny (promocja do inta). Jeœli zamiast siódemki by³aby inna zmienna to robi¹c tak jak wy¿ej da siê przekonaæ kompilator ¿e chcê wykonaæ AND na liczbach oœmiobitowych - ale jak to zrobiæ z bezpoœredni¹ wartoœci¹?
AVR-GCC i glupi problem
Apr 04, 2004
9 Replies
Moze '\x7'
Krzysiek Rudnik
U¿ytkownik "Darek R." snipped-for-privacy@w.pl napisa³ w wiadomoœci news:c4pm9r$73j$ snipped-for-privacy@nemesis.news.tpi.pl...
chcesz jak najbardziej minimalny kod wynikowy ? to sprobuj z dodatkowa zmienna:
register unsigned char tmp;
tmp = val & 7;
if( tmp ) { // ... }
Andy napisa³:
Ok, to dzia³a tak jak powinno (czyli na 8 bitach) - dziêki. A bez dodatkowej zmiennej nie da siê wyt³umaczyæ kompilatorowi ze ja nie chcê inta?
Krzysztof Rudnik napisa³:
Dalej promuje do inta.
U¿ytkownik "Darek R." snipped-for-privacy@w.pl napisa³ w wiadomo¶ci news:c4poi1$i0i$ snipped-for-privacy@atlantis.news.tpi.pl...
nie wiem nic innego nie wymyslilem
moze ktos inny jeszcze cos madrego napisze
Ale skoro to zmienna rejestrowa, to po co ¿a³owaæ na ni±? Jest lokalna (mo¿na dodaæ klamerki). Przecie¿ optymalno¶æ nie zale¿y od d³ugo¶ci listingu w C, tylko od kodu wynikowego i wykorzystania pamiêci.
TG.
U¿ytkownik "Krzysztof Rudnik" snipped-for-privacy@kki.net.pl> napisa³ w wiadomo¶ci news:c4pq48$13a5$ snipped-for-privacy@news.atman.pl...
Nie znam GCC, ale sprobuj 7u Pozd Gissbourne
Gissbourne napisa³:
Nadal promocja do inta.
T.G. napisa³:
Niby racja. Dziwi mnie tylko ¿e nie mozna przet³umaczyæ kompilatorowi ¿e nie chcê ¿adnej niejawnej konwersji. Jako¶ do tej pory w najró¿niejszych kompilatorach C (a pisa³em w ró¿nych kompilatorach na rózne platformy) w podobnych przypadkach zawsze da³o siê unikn±æ niechcianej niejawnej konwersji jawnie podaj±c mu typ - wiêc po prostu by³em mocno zdziwiony jak przegl±daj±c kod asemblerowy zobaczy³em co kompilator z tym zrobi³ mimo moich wysi³ków ¿eby temu zapobiec. Tak trochê na marginesie - moim prywatnym zdaniem niejawne konwersje s± najwiêksz± zmor± C. Ile razy siedzia³em szukaj±c g³upiego b³êdu bo zapomnia³em ¿e tu kompilator mo¿e dokonaæ niejawnej konwersji... IMHO nie powinno byæ absolutnie _¿adnych_ niejawnych konwersji, nawet w oczywistych przypadkach - kompilator powinien zg³osiæ niezgodno¶æ typów, programista wstawiæ jawn± konwersjê (wiedz±c co robi i ¿e tego chce) i ¿ycie by³oby duzo prostsze.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required