RTV forum PL | NewsGroups PL

Zrozumienie promocji typów w AVR-GCC: Jak sprawdzić 3 najmłodsze bity zmiennej unsigned char?

AVR-GCC i glupi problem

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Zrozumienie promocji typów w AVR-GCC: Jak sprawdzić 3 najmłodsze bity zmiennej unsigned char?

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

elektroda NewsGroups Forum Index - Elektronika Polska - Zrozumienie promocji typów w AVR-GCC: Jak sprawdzić 3 najmłodsze bity zmiennej unsigned char?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map