Spravny zapis sucinu v C

C,C++,C#

Moderátori: psichac, Moderátori

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4416
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Spravny zapis sucinu v C

Príspevok od používateľa romiadam » 29 Júl 2022, 19:16

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?
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

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Spravny zapis sucinu v C

Príspevok od používateľa maskrtnik01 » 29 Júl 2022, 19:41

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.
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Spravny zapis sucinu v C

Príspevok od používateľa Atlan » 29 Júl 2022, 21:28

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

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4416
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Spravny zapis sucinu v C

Príspevok od používateľa romiadam » 29 Júl 2022, 23:10

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. :applause:
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

Napísať odpoveď