AVR-GCC i glupi problem

Apr 04, 2004 9 Replies

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¹?


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