Ahojte,
V pro. C som zaciatocnik. Mam takyto problem.
v MPLAX IDE potrebujem zapisat nasobenie 8bit x 16bit a vsledok je niekedy 24Bit.
a - 24bit
b - 16bit = 311
c - 8bit = 221
Ja som to zapisal takto:
a=( (b*c ) /1000); vysledok tohoto je cislo 3, co je blbost. Vysledok by mal byt 68.
b*c = 68731, co je viac ako 16bit (65536)
Ked som te program krokoval, tak som zistil ze sa to pocita v programe Umul16.c (kompilator to tak nastavil), ktory vracia 16bitove cislo takze tam sa to nejako usekne.
Ja ale potrebujem aby sa to pocitalo v Umul24.c
Predpokladam, ze moj zapis nie je spravny. Ja som si myslel, ze ked nasobim 16bit s 8bit, tak compilator k tomu prideli sucin, kde vysledok ma 24 bitov a nie 16. Ako sa to potom spravne zapisuje v C?
Potrebujem aby sa sucin b*c pocitalo ako 24bitove cislo, potom sa to vydelilo cislom 1000, a tento vysledok sa zapisal do 8bitoveho cisla napr. d, nakolko vysledok po vydeleni cislom 1000 nikdy nepresiahne 8 bitov.
Dakujem.
EDIT:
Medzitym som googlil a nasiel som nieco.
a - 8bit
b - 16bit = 311
c - 8bit = 221
Zapisal som to takto:
a=( ( (uint24_t)b * c ) /1000);
a teraz s tymto zapisom uz sa to pocita v Umul24.c a vysledok je 68 v a.
Je to takto spravne zapisane? Takto sa to robi? Alebo inak?
Nechapem preco ja musim docasne predefinovat b na 24bitove cislo. Preco to kompilator nevie sam, ze ak nasobi 16 * 8 bitov, tak sa to ma robit v Umul24.c a nie v Umul16.c?
Spravny zapis sucinu v C
Moderátori: psichac, Moderátori
-
- Ultimate člen
- Príspevky: 4421
- Dátum registrácie: 09 Apr 2008, 00:00
- Bydlisko: Wicklow, Irsko
- Vek: 47
Spravny zapis sucinu v C
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje
-
- Ultimate člen
- Príspevky: 2582
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: Spravny zapis sucinu v C
16bit x 16bit je proste 16bit, klasika.
24bit neviem poradiť. Ak by vyhovovalo 32bit, treba ešte pred násobením minimálne jeden argument pretypovať na 32bitové číslo. Potom 32bit x 32bit je 32bit a výsledok bude správny.
Vlastne pozerám, že 24bit ste si už našli. Takže je po probléme.
Mimochodom, krátka úvaha. Ak by compiler riešil to, že 16bit x 16bit môže výjsť viac ako 65536. Niekto by naopak mohol nadávať, že má to ustražené a aj tak compiler generuje neoptimálny kód. Proste toto je na programátorovi, aby zvážil kedy je potrebné ako pretypovať, aby nedošlo k overflow/underflow.
24bit neviem poradiť. Ak by vyhovovalo 32bit, treba ešte pred násobením minimálne jeden argument pretypovať na 32bitové číslo. Potom 32bit x 32bit je 32bit a výsledok bude správny.
Vlastne pozerám, že 24bit ste si už našli. Takže je po probléme.
Mimochodom, krátka úvaha. Ak by compiler riešil to, že 16bit x 16bit môže výjsť viac ako 65536. Niekto by naopak mohol nadávať, že má to ustražené a aj tak compiler generuje neoptimálny kód. Proste toto je na programátorovi, aby zvážil kedy je potrebné ako pretypovať, aby nedošlo k overflow/underflow.
0
Re: Spravny zapis sucinu v C
Podla vsetkeho by stacilo a definovat ako 32bit res 24bit. A fungovalo by to, nevyjoda je ze zabera vela miesta v pameti. To prrtypovanie co si spravil je klasicka pouzivana vec.
0
-
- Ultimate člen
- Príspevky: 4421
- Dátum registrácie: 09 Apr 2008, 00:00
- Bydlisko: Wicklow, Irsko
- Vek: 47
Re: Spravny zapis sucinu v C
Sice to uz pocitalo spravne, ale na to "a" mi kompilator hlasil Warning, ze vysledok 24bit sa zapisuje do 8bit (co v mojom pripade je OK, lebo a nikdy nebude viac ako 8bit), tak som cely matematicky vysledok pretypoval na 8bit a zapisal takto:
a=(uint8_t)( ( (uint24_t)b * c ) /1000);
a uz kompilator je ticho a aj vysledok je OK.
a=(uint8_t)( ( (uint24_t)b * c ) /1000);
a uz kompilator je ticho a aj vysledok je OK.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje