Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: "Ciudatenie" de memorie  (Citit de 4309 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« : 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?
Memorat
stef2n
Nu mai tace
*****

Karma: 218
Deconectat Deconectat

Mesaje: 641



Vezi Profilul
« Răspunde #1 : 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.
Memorat

Exista 10 categorii de oameni: cei care inteleg sistemul binar si cei care nu il inteleg.
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #2 : 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.
Memorat
megabyte
Client obisnuit
**

Karma: 45
Deconectat Deconectat

Mesaje: 74



Vezi Profilul
« Răspunde #3 : Februarie 25, 2008, 18:31:32 »

  Am gasit si eu ceva asemanator.De exemplu pentru codul urmator:
Cod:
#include <stdio.h>
#include <conio.h>
int main()
{
  long j,bit=1;
  for(j=0;j<32;++j)
  {
    printf("%ld %ld\n",(1<<j),(bit<<j));
  }
  getch();
  return 0;
}
pe un compilator de 32 biti afiseaza valori identice dar in borland nu mai merge de la 2^15.Pana la urma mi-am dat seama ca trebuie sa convertesc constanta in long:
Cod:
 printf("%ld %ld\n",((long)1<<j),(bit<<j));
Memorat

Toate computerele asteapta cu aceeasi viteza.
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines