Túlcsordulás

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Túlcsordulás

Hozzászólás Szerző: berkesandor »

Nagyon egyszerű dolgon akadtam el, sajnos nem értem a dolog okát.

Kód: Egész kijelölése

long szam;
int valtozo;

void setup() {

Serial.begin(9600);
  

}

void loop() {

szam = (2017%10)*valtozo;
Serial.print ("Valtozo: ");
Serial.println (valtozo);
Serial.print ("Szam: ");
Serial.println (szam);

valtozo = valtozo + 100;
}
Soros monitor:

"Valtozo: 4500
Szam: 31500
Valtozo: 4600
Szam: 32200
Valtozo: 4700
Szam: -32636
Valtozo: 4800
Szam: -31936
"
A szam miért csordul túl , amikor long típusú változó?
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Túlcsordulás

Hozzászólás Szerző: atilla »

A valtozo nevű változónak nem long típusúnak kellene lennie?
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Túlcsordulás

Hozzászólás Szerző: berkesandor »

Az csak 4700 -nál jár túlcsordulás pillanatában. Ha azt is long -ként definiálom, akkor valóban nem csordul túl.
Csak azt nem értem miért csordul túl így.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Túlcsordulás

Hozzászólás Szerző: Robert »

Tipp:
(2017%10)*valtozo
A 2017%10 = 7
valtozo Integer (-32k...+32k)
4700*7 = 32900 (!) 32900-32768 = 132-vel túlcsordult, ami a -32768+132= -32636
És a változó (integer-t) teszed áz a számba. Azaz INTEGER hely van lefoglalva a számoláshoz, nem LONG.
http://www.tavir.hu - a gazda :)
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Túlcsordulás

Hozzászólás Szerző: berkesandor »

Köszönöm a választ, sajnos probléma összetettebb, csak ezzel a kis mintával mutattam meg a problémámat.
Lényeg: szeretnék létrehozni egy változót, ahol az aktuális év utolsó számjegyét megszorzom 10000-el, a hónapot 100 -al majd hozzáadom hogy hányadika van.
De sajnos long-ként definiálva is túlcsordul.

Kód: Egész kijelölése

ido_valtozo =( ( (ev%10) * 10000) + ( ho* 100 ) + nap ) ;
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Túlcsordulás

Hozzászólás Szerző: Robert »

A legbelső változód (év) vagy az e helyetti átmeneti változód legyen long típus.
http://www.tavir.hu - a gazda :)
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Túlcsordulás

Hozzászólás Szerző: berkesandor »

ido_valtozo lenne long, az ev int.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Túlcsordulás

Hozzászólás Szerző: Robert »

"A programok az utasítások és nem a kívánságok szerint működnek :)"

Műveletei precedenciák és szabályok
A precedenciák megadják, hogy mivel kell kezdeni a kiértékelését a műveleteknek Minél nagyobb egy művelet precedenciája annál hamarabb kell elvégezni a műveletet.

Aritmetikai műveletek precedenciája: (nagyobb precedenciához kisebb szám tartozik!)
0. Modulo, egészrész (ha jól emlékszem)
1.hatványozás, gyökvonás,
2.szorzás, osztás,
3.összeadás, kivonás.

A modulo az a legelső és ennek a változótípusa kerül lefoglalása és ezen át történnek a műveletek. Azaz hiába a long-ot akarjuk eredményül...
A precedenciasor és a változótípus határozza meg az eredményt...


Kiegészítés:
Logikai műveletek precedenciája (nagyobb precedenciához kisebb szám tartozik!)
1.NOT,
2.AND,
3.OR.

És a zárójelekkel a sorrend megváltoztatható.
http://www.tavir.hu - a gazda :)
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Túlcsordulás

Hozzászólás Szerző: berkesandor »

Magyarul az ev-nak is long-nak is kell lenni, nem elég az ido_valtozo-nak.
Köszönöm a válaszod.
ksanci
DrótVégénSzéndarab
Hozzászólások: 28
Csatlakozott: 2016. július 24. vasárnap, 12:04

Re: Túlcsordulás

Hozzászólás Szerző: ksanci »

Szia!

És ha a programban számokkal végzel műveletet közvetlenül long típusú változókkal, akkor a szám is long legyen. Tehát pl. nem 100, hanem 100L.
Vagy ez evidens? Nekem nem volt :)
Válasz küldése