|
Titlul: "Ciudatenie" de memorie Scris de: MciprianM din Februarie 25, 2008, 15:44:17 Ciudatenie: am urmatoarea expresie:
m=((xc-a-1)*(yc-1)-cmb1+1)/2; Pe compilatorul borland c++ care se foloseste la oji m este de tip long, iar xc,yc,cmb1 de tip int pun watch si inainte de linia de mai sus am: m-valoarea ramasa din memorie xc:5000 a:20 yc:5000 cmb1:20 si dupa ce trec de linia respectiva am toate la fel in afara de m care da ceva de genu -8567 daca scriu mai multe instructiuni de tip m=xc-a-1; m=m*(yc-1); m=m-cmb1+1; m=m/2; imi da raspunsul corect(cateva milioane). Care poate fi cauza problemei? Titlul: Răspuns: "Ciudatenie" de memorie Scris de: Stefan Istrate din Februarie 25, 2008, 15:53:34 Pentru 2 variabile A si B, si un operator op, expresia A op B se efectueaza conform tipului de date "cel mai incapator". Deci, daca A si B sunt int, rezultatul este int. Daca A si B sunt long, rezultatul este long. In schimb, daca A este int, iar B este long, se face mai intai conversia lui A la long si de-abia apoi se calculeaza rezultatul pe long.
Pentru exemplul tau, in primul caz rezultatul se calculeaza pe int si se atribuie unei variabile long, din acest motiv aparand un numar negativ. In al doilea caz, rezultatul se calculeaza direct pe long si sunt evitate astfel erorile. Titlul: Răspuns: "Ciudatenie" de memorie Scris de: MciprianM din Februarie 25, 2008, 16:00:31 Multumesc mult. Acuma imi amintesc ceva de pe clasa a 9-a. Am pierdut destule puncte la oli din cauza la chestia asta.
Titlul: Răspuns: "Ciudatenie" de memorie Scris de: Barsan Paul din Februarie 25, 2008, 18:31:32 Am gasit si eu ceva asemanator.De exemplu pentru codul urmator:
Cod: #include <stdio.h> Cod: printf("%ld %ld\n",((long)1<<j),(bit<<j)); |