AVR-GCC i glupi problem
Masz problem? Zapytaj na forum elektroda.pl
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: AVR-GCC i glupi problem
Date: Sun, 4 Apr 2004 21:00:27 +0200
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.atman.pl!not-for-mai
From: Krzysztof Rudnik <rudnik_at_nospam_kki.net.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Sun, 04 Apr 2004 21:25:54 +0200
Darek R. wrote:
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!wsisiz.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Sun, 4 Apr 2004 22:56:38 +0200
Krzysztof Rudnik napisał:
Moze '\x7'
Dalej promuje do inta.
--
Pozdrowienia
Dariusz Rzońca
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.rmf.pl!poznan.rmf.pl!news.man.poznan.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Gissbourne" <gissbourne_at_nospam_poczta.onet.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Tue, 6 Apr 2004 11:50:59 +0200
Użytkownik "Krzysztof Rudnik" <rudnik_at_nospam_kki.net.pl> napisał w wiadomości
news:c4pq48$13a5$1_at_nospam_news.atman.pl...
napiszę tak: if ( i & 7 )
Moze '\x7'
Nie znam GCC, ale sprobuj 7u
Pozd
Gissbourne
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.rmf.pl!poznan.rmf.pl!news.man.poznan.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Wed, 7 Apr 2004 00:13:06 +0200
Gissbourne napisał:
Nie znam GCC, ale sprobuj 7u
Nadal promocja do inta.
--
Pozdrowienia
Dariusz Rzońca
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!pwr.wroc.pl!panorama.wcss.wroc.pl!news.man.poznan.pl!news.nask.pl!news.cyf-kr.edu.pl!not-for-mai
From: "Andy" <anokWYTNIJ_at_nospam_ceti.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Sun, 4 Apr 2004 21:33:00 +0200
Użytkownik "Darek R." <drzonca_at_nospam_w.pl> napisał w wiadomości news:c4pm9r$73j$1_at_nospam_nemesis.news.tpi.pl...
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Sun, 4 Apr 2004 21:43:17 +0200
Andy napisał:
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!feed.news.interia.pl!news.cyf-kr.edu.pl!not-for-mai
From: "Andy" <anokWYTNIJ_at_nospam_ceti.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Mon, 5 Apr 2004 18:13:54 +0200
Użytkownik "Darek R." <drzonca_at_nospam_w.pl> napisał w wiadomości news:c4poi1$i0i$1_at_nospam_atlantis.news.tpi.pl...
...
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
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai
From: "T.G." <gunday_at_nospam_poczta.onet.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Mon, 5 Apr 2004 23:02:39 +0200
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.
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.mega.net.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: Re: AVR-GCC i glupi problem
Date: Wed, 7 Apr 2004 00:30:46 +0200
T.G. napisał:
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.gazeta.pl!opal.icpnet.pl!topaz.icpnet.pl!not-for-mai