Pretypovavani promennych v cecku
Josef Štengl
ok1ced@nagano.cz
Středa Leden 23 11:35:54 CET 2008
A nejvíce je těch nevýznamných keců okolo :-)
Jelikož jsem nachcípaný a tudíš extrémě líný i na moje poměry, tak to
nebudu dohledávat v referenci, ale pokud si dobře pamatuji;
Pro výpočet a pro implicitní přetypování se použije vždy ten "větší"
typ pro právě a jen pro ty členy výrazu se kterými se počítá (respektive
kompilují). Žádná predikce se nekoná.
Když se nad tím zamyslíte, tak jak by jste jste chěl kompilátor
přesvědčit aby kompilal tak jak máte momentálně na mysli, je mnohem lepší
aby dělal to co mu napíšete :-).
Naučil jsem se v C uvažovat tak že výraz interpretuji od prvotní operace
(většinou ten v nejvnitřejší závorce) a nic si k tomu nepřidávám. Zatím
i to vychází.
A to i pro
int16=(float)100*(int16/1024)
int16=100*(float)(int16/1024)
Napadlo mě že by to v druhém případě mohl odhadnout, ale ne, počítá to
pořád stejně (gcc). To je podle toho co vím správné.
Bližší informace určitě najdede v C referenci.
Ale když jseme u toho kecání, tak jestli kompilujete Keilem, tak bacha na
něj. Strávil jsem několik hodin, které měly neblahý vliv na mé
sebevědomí, kdy to byla chyba kompilátoru. Ano, jsem si jistý, po přidání
zcela nevýznamného nopu to začalo funovat. A bylo to dvakrát. Je to pak
vidět v lst souborech, prostě tam chybí přeložené řádky, což je u
větvení trošku nemilé. Bohužel kód už nemám, ani nebyl veřejný.
Mimochodem experiment s jedním kompilátorem na jedné architektuře ještě
není důkazem, pokud k tomu nepředložíte specifikaci, že je to
dokumenované a očekávané chování.
Aby se vám to pak ma MIPSu nechovalo jinak než na i386 jako mě :-).
ced
On Tue, Jan 22, 2008 at 12:36:32PM +0100, Jiri Bezstarosti wrote:
> To je zajimave, ze nekdo napise mene pismen, aby to zjistil, a nekdo
> vice pismen, aby se zeptal. Ne, nechci rypat, ale fakt se na to
> podivejte, kolik pismen ma dotaz a kolik pismen zdrojak, pro overeni jak
> to je ;). A pokud nekdo pise v Ccku, prece musi nutne mit na cem ten
> experiment udelat, protoze samotna znalost C bez napsani jedineho
> programku je k nicemu (lidsky: ciste akademicka znalost programovaciho
> jazyka je na nic).
>
> Opravdu se nechci do nikoho navazet a ani nikoho deptat a podobne, ale
> prosim, zkuste vzdycky nejprve projevit nejakou snahu o samostatnost. Je
> jasne, ze cloveka hned vsechno nenapadne, ale nekdy je fakt mnohem
> rychlejsi se dobrat odpovedi samostane udelanym experimentem, nez
> dotazem, kde cekate na odpoved, jestli nekdo neodpovi.
>
> --
> Jiri Bezstarosti
>
>
> Pavel Troller napsal(a):
>
> >>Chtel bych se zeptat, zda je jedno jestli pretypuji v C kompilatoru ve vyrazu prvni operator nebo posledni, zda mi to vrati vzdy stejny vysledek ? Jde mi o to zda si prekladac nejdrive projde vsechny promenne a podle nejpresnejsi promenne zvoli typ promenne pro mezioperace a nebo to funguje nejak jinak ?
> >>
> >>Bude vysledek techto vyrazu stejny ?
> >>
> >>int16=100*((float)int16/1024)
> >>int16=100*(int16/(float)1024)
> >>int16=(float)100*(int16/1024)
> >>
> >>tohle samozrejme vrati vysledej jiny, jelikoz se pouzije deleni bez desetinnych mist:
> >>int16=100*(int16/1024)
> >>
> >>
> >>dekuji
> >>Milos Sula
> >>
> >>
> >Zdravim,
> > rekl bych, ze 1 a 2 budou stejne, ale 3 bude jine - deleni v zavorce se
> >vypocte v int a pak se znasobi floatem 100, coz neni ono.
> > Kratky test (s jinymi hodnotami) to prokazuje:
> >
> >#include <stdio.h>
> >
> >int main(void) {
> > int a,b;
> >
> > a=5;
> > b=13;
> >
> > printf("%f, %f, %f\n",
> > 100*((float)a/b),
> > 100*(a/(float)b),
> > (float)100*(a/b)
> > );
> >}
> >
> >$ gcc -o test2 test2.c
> >$ ./test2
> >38.461540, 38.461540, 0.000000
> >
> >S pozdravem Pavel Troller
> >_______________________________________________
> >HW-list mailing list - sponsored by www.HW.cz
> >Hw-list@list.hw.cz
> >http://list.hw.cz/mailman/listinfo/hw-list
> >
> >
> >
> >
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list