Darek R.
Guest
Sun Apr 04, 2004 6:00 pm
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ą?
--
Pozdrowienia
Dariusz Rzońca
Krzysztof Rudnik
Guest
Sun Apr 04, 2004 6:25 pm
Darek R. wrote:
Quote:
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
Andy
Guest
Sun Apr 04, 2004 6:33 pm
Użytkownik "Darek R." <drzonca@w.pl> napisał w wiadomości news:c4pm9r$73j$1@nemesis.news.tpi.pl...
Quote:
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ą?
...
chcesz jak najbardziej minimalny kod wynikowy ?
to sprobuj z dodatkowa zmienna:
register unsigned char tmp;
tmp = val & 7;
if( tmp ) {
// ...
}
--
Andrzej
Darek R.
Guest
Sun Apr 04, 2004 6:43 pm
Andy napisał:
Quote:
chcesz jak najbardziej minimalny kod wynikowy ?
to sprobuj z dodatkowa zmienna:
register unsigned char tmp;
tmp = val & 7;
if( tmp ) {
// ...
}
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?
--
Pozdrowienia
Dariusz Rzońca
Darek R.
Guest
Sun Apr 04, 2004 7:56 pm
Krzysztof Rudnik napisał:
Quote:
Moze '\x7'
Dalej promuje do inta.
--
Pozdrowienia
Dariusz Rzońca
Andy
Guest
Mon Apr 05, 2004 3:13 pm
Użytkownik "Darek R." <drzonca@w.pl> napisał w wiadomo¶ci news:c4poi1$i0i$1@atlantis.news.tpi.pl...
Quote:
...
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?
...
nie wiem
nic innego nie wymyslilem
moze ktos inny jeszcze cos madrego napisze
--
Andrzej
T.G.
Guest
Mon Apr 05, 2004 8:02 pm
Quote:
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?
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.
Gissbourne
Guest
Tue Apr 06, 2004 8:50 am
Użytkownik "Krzysztof Rudnik" <rudnik@kki.net.pl> napisał w wiadomo¶ci
news:c4pq48$13a5$1@news.atman.pl...
Quote:
napiszę tak: if ( i & 7 )
Moze '\x7'
Nie znam GCC, ale sprobuj 7u
Pozd
Gissbourne
Darek R.
Guest
Tue Apr 06, 2004 9:13 pm
Gissbourne napisał:
Quote:
Nie znam GCC, ale sprobuj 7u
Nadal promocja do inta.
--
Pozdrowienia
Dariusz Rzońca
Darek R.
Guest
Tue Apr 06, 2004 9:30 pm
T.G. napisał:
Quote:
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.
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.
--
Pozdrowienia
Dariusz Rzońca