Chybný výsledek násobení dvou 16-bitových čísel typu int

Dobrý den

Při násobení douv čísle např. 1000 * 1000 , výsledkem by mělo být v hexa F4240. Program dává výsledek v hexa 0x42 a 0x40 . tedy první dvě části, hodnoty ze zbývajících 2 registrů jsou nulové.
Program vypadá:

long cislo;
cislo=1000 * 1000;

díky za rady.

:arrow_right: administrator: přejmenováno z "Násobení dvou čísel typu int"

v com pises ? Mne to ani prekladac nepovolil prelozit
warning: integer overflow in expression

v AVR Studio

Překladač si to interně před překladem násobí(proč by tím zatěžoval mcu když je výsledek vždy stejnej) jen v 16 bitech (int) a do proměnný nacpe oříznutej výsledek. Když napíšeš rovnou long temp = 1000000; bude to v paměti vpořádku stejně tak jako po vynásobení dvou long proměnných.

Když napíšeš long temp = (long)1000 * (long)1000; bude to ok.

Nebo řečeno jinak:
Konstanta je v AVR-GCC defaultně typu int.
Když vynásobíme dvě čísla typu int, dostaneme výsledek typu int.
Aby výsledek byl typ long, musí aspoň jeden člen na pravé straně být typu long.
Konstantu přetypujeme na long buď tak jak píše piityy, nebo častěji sufixem L.

long cislo; cislo = 1000L * 1000;

hm skusal si to lebo to nepocita dobre vyslo F1388

Většině to počítá správně :wink: Funguje jak můj tak ABho zápis. V registrech r27:24 jsou správné hodnoty.
nasobeni.gif

beriem spat funguje …simoloval som to v C a tym padom ked preslo na dalsi prikaz tak prepisalo registre 24,25. V diasemb to vidno a ide to ako ma.

sorry :blush: