Integrator de eroare de overflow
Bună ziua, dragii maeștri! Am o întrebare stupidă, dar totuși nu știu răspunsul:
există astfel de variabile:
# xA0; X: DWORD;
A, B: DWORD;
și un astfel de cod:
Verificarea Overflow INCLUS - a început să arate o eroare, iar în cazul în care B> A, adică, în paranteze un număr negativ. X face întreg „om nedorit, atunci există o piesă pe asm, el este folosit ca un rezultat pozitiv Care este motivul pentru care, am stabilit în mod deliberat și ABS nu funcționează Da, am încercat, de asemenea, să scrie valorile variabile, cum ar fi ..:
și totul este bine! De ce este așa?
când opțiunea de verificare a depășirii este activată:
compilatorul consideră că atunci când A, B: DWORD Valoarea calculată a lui A-B cat ar trebui să aibă un tip explicit al unui DWORD, ale cărei valori reprezintă intervalul nu otits.znacheniya inclus, ca leziuni în timp și raportate cu excepția overflow întreg
compilator generează cod în general numesc FCT Abs () și operațiunile c / h multiplicare deoarece întreaga expresie poate fi calculată la compilare, pentru a obține un rezultat fără echivoc = clar 10 și atribuiți-l unei variabile X, care nu trezesc nici excepții, rezult.chislo beneficiu 10 este cu siguranță o parte a gamei de reprezentări de tip DWORD, astfel încât controalele de cod pentru compilator overflow nici măcar nu generează
citiți ca "nimeni nu generează"
> X face întreg "oh nedorite, atunci există o piesă pe asma,
> este folosit acolo ca un întreg pozitiv
Nu există restricții. utilizați variabila as-block X așa cum doriți - cel puțin ca un semn ca un nesemnat.
în dan.sluchae absolut indiferent de tip, care - întreg sau dword - are o variabila X folosită în asm-bloc, este important ca dimensiunea variabilei în memorie, și prin aceea că, în caz contrar ar fi aceleași
Hmm. Am făcut totul de dragul experimentului
povestea este aceeași, dar după o astfel de schimbare:
eroarea a dispărut. În general, problema este rezolvată, dar cum - nu am înțeles.
Abs este lipsit de sens pentru dword
și acest lucru este, de asemenea, de înțeles
> În general, problema este rezolvată, dar cum - nu am înțeles
ciudat ajungeți la rezolvarea problemei - prin metoda "pătrunderii științifice".
Lucrezi în mod explicit cu expresii care te duc la timpul de rănire în t.ch. și otrits.zacheniya (și altfel, despre care nebunul, atunci Abs, este întrebat?), și să declare variabilele ca întregi nesemnate.
și cu verificarea opțiunea de preaplin - aceeași situație este discutabilă, deoarece în asm-bloc, în cazul în care sunteți liberi de a face cu orice variabilă de orice tip nimic, compilatorul este lipsit de putere pentru a ține evidența erorile logice
# xA0; X: octet;
# xA0; A: WORD;
# xA0; B: DWORD;
Nu există greșeli! și dacă fără Abs (), atunci eroarea de verificare a intervalului.
# xA0 (la momentul depanării A = 7; B = 8;);
# xA0; X: octet;
# xA0; A: WORD;
# xA0; B: DWORD;
Nu există greșeli! și dacă fără Abs (), atunci eroarea de verificare a intervalului.
# xA0 (la momentul depanării A = 7; B = 8;);
Problema este în adâncimea de biți a variabilelor chtoli? (16 biți, 32 biți)?
> Problema este în adâncimea de biți a variabilelor chtoli? (16 biți, 32 biți)?
în cazul A-B, compilatorul consideră că tipul de rezultat al valorii expresiei este tipul dword, altfel - întreg
Se pare că ești cu un semn asim, deoarece folosești blocuri pe el.
Nu este atât de greu să vezi în modul de depanare, care compilator mash.kod generează în acest caz sau în acel caz.
X: = (Max (A, B) - Min (A, B)) * 2
și toate afacerile). și nu depășesc).
diferența dintre max. și min. valorile vor fi întotdeauna> = 0
> # xA0; A este lățimea imaginii în octeți calculate (numărul de puncte
> se înmulțește cu numărul de octeți per punct);
> # xA0; B este lățimea în octeți adevărată, cu aliniere (fișiere bmp
> # xA0; trebuie să existe "aliniat cuvântul");
> # xA0; X este valoarea "aditivului", adică câte octeți să adăugați
> la sfârșitul fiecărei linii pentru a alinia cu cuvintele, nu
> poate fi mai puțin de zero teoretic
Rezultă că A, B și X pot fi descrise ca un întreg și folosesc X: = Abs (A-B) * 2; ca în întrebare. Ei bine, dacă în principiu ar trebui să fie DWORD, atunci puteți utiliza distribuția explicită a tipurilor X: = Abs (Integer (A) -B) * 2;
Având în vedere codul generat de compilator, se va vedea că ar putea fi necesar să se aplice turnarea explicită în altă parte.
Memorie: 0,76 MB
Sincronizare: 0.064 sec