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