Egész túlcsordulás hiba

Egész túlcsordulás hiba

Jó napot, nagyon tiszteletben tartják a mester! Van egy hülye kérdés, de mégis, nem tudom a választ, hogy:
vannak változók:

# XA0; X: DWORD;
A, B: DWORD;
és az alábbi kódot:

Túlvezérlés ellenőrzés - kezdett mutató hibát, és abban az esetben a B> A, azaz zárójelben negatív szám. X do integer „om nemkívánatos, akkor van egy darab ASM, ő szolgált pozitív Mi az oka, azt szándékosan és ABS nem működik Igen, én is próbáltam írni a változók értékei, mint például ..:

és minden rendben van! Miért?

Amikor a túlfolyó ellenőrzése lehetőségek:

a fordító úgy véli, hogy ha A, B: DWORD számított értéke A-B, illetve kell egy explicit típus egy DWORD, melynek értékei képviseli a tartományban otits.znacheniya nem szerepelnek, mint in-time sérülések és jelenteni, kivéve egész túlcsordulás

fordító generál kódot általában hívja funkcióban Abs (), valamint a műveletek c / h szorzás, mert az egész kifejezést lehet számítani fordítási időben, így egyértelmű eredményt egyértelműen = 10 és hozzárendeli egy X változó, amelyek nem keltenek semmilyen kivételt, az ellátás rezult.chislo 10. minden bizonnyal része a tartomány reprezentációs típusú DWORD, így a kód ellenőrzi túlcsordulás fordító nem is generál

olvasni „általában nem termelnek”


> X do egész szám „om nemkívánatos, akkor van egy darab ASM,
> Ő használtunk pozitív

nincs korlátozás. Használt X változó ASM-blokk, ahogy tetszik - legalábbis mint egy mérföldkő akár aláírva.

a dan.sluchae teljesen közömbös, hogy milyen típusú - egész szám vagy duplaszó - egy X változó használt ASM-blokk, fontos, hogy a méret a változó a memóriában, és hogy, és a másik esetben ez ugyanaz lesz

Hmm. Csináltam mindegy kedvéért a kísérlet

A történet ugyanaz, de a változás után:

a hiba eltűnt. Általában a probléma megoldódott, de - nem értem.

Abs értelmetlenné dword

és az is érthető,


> Általában a probléma megoldódott, de - nem értem

Te egy furcsa megközelítés a problémát - a „művelt tét”.

munka egyértelműen kifejezések fogadó fél sebek, beleértve és otrits.znacheniya (egyébként a fene jester majd Abs, már az is kérdéses?), és a változók nyilvánították előjel nélküli egész számot.

és lehetőség túlfolyó ellenőrzése - ugyanez a helyzet megkérdőjelezhető, mert az asm-blokk, ahol szabadon köze a változó bármilyen típusú semmit, a fordító tehetetlen nyomon követheti a logikai hibák

# XA0; X: byte;
# XA0; A: WORD;
# XA0; B: DWORD;

nincs hiba! és ha nem Abs () a Range check error.
# XA0 (abban az időben a hibakeresés A = 7; B = 8;)

# XA0; X: byte;
# XA0; A: WORD;
# XA0; B: DWORD;

nincs hiba! és ha nem Abs () a Range check error.
# XA0 (abban az időben a hibakeresés A = 7; B = 8;)
A dolog kicsit változó chtoli? (16 bites, 32 bites)?


> A dolog kicsit változó chtoli? (16 bites, 32 bites)?

abban az esetben, A-B típusú a fordító úgy véli, a kapott kifejezés értékét type dword, különben - egész

tetszik az ASM-edik jel, mivel a blokkok használja azt.
nem túl nehéz belátni a debug módban, ami mash.kod fordító generál egy adott ügyben.

X: = (Max (A, B) - Min (A, B)) * 2

és minden üzleti). és bármely túlcsordulás).
a különbség a max. és min. értéke mindig is> = 0


> # XA0; A - a kép szélessége kiszámított bájt (a pontok száma
> Számával szorozva vásárolni egy pontig)
> # XA0; B - a szélessége, a bájt, igaz, az összehangolás (BMP-fájlokat
> # XA0, ott kell lennie „szót igazított”);
> # XA0; X - az az összeg „adalékanyagok”, azaz a hány bájt hozzáadni
> A végén minden sor, hogy összehangolják a szavakat, nem
> Lehet kisebb, mint nulla elméletben

Ebből az következik, hogy az A, B és X lehet leírni, mint egész szám, és használat X: = Abs (A-B) * 2; kérdéses. Nos, ha alapjaiban kell lenniük DWORD, akkor explicit típus X: = Abs (Integer (A) -B) * 2;
Nézzük a kódot a fordító által generált, akkor látható, hogy szükség lehet máshol használni explicit öntött.

Memória: 0,76 MB
Idő: 0.064 c

Kapcsolódó cikkek