Eroare totală eroare

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







Articole similare

Trimiteți-le prietenilor: