Kurzusok
/
C#
C#
/
Tanterv
/
Túlcsordulás
Tú

Túlcsordulás ebben a kurzusban: C#

1 feladat

A(z) Túlcsordulás fogalomról

A feladat bemutatja, hogyan viselkednek a különféle numerikus típusok túlcsorduláskor, vagyis amikor a kapacitásuk nem elegendő egy számítás, például egy aritmetikai művelet vagy egy kasztolás eredményének a tárolására.

  • Az előjel nélküli egészek (byte, ushort, uint, ulong) nullára fordulnak át (a típus maximális értéke + 1 modulusként működik), kivéve, ha nagyjából egy checked blokkon belül szerepelnek, mert akkor OverflowException példány keletkezik. Az int és a long hasonlóan viselkedik, csak éppen int.MinValue-ra, illetve long.minValue-ra fordulnak át.
int one = 1;
checked
{
    int expr = int.MaxValue + one;  // overflow exception is thrown
}

// or

int expr2 = checked(int.MaxValue + one);  // overflow exception is thrown
  • Ha egy literál kifejezés túlcsordulást okozna abban a változóban, amelynek értékül adjuk, akkor fordítási idejű hiba lép fel.
  • A checked állapot csak a blokkban közvetlenül szereplő kifejezésekre vonatkozik. A meghívott függvényekben bekövetkező túlcsordulásokat nem kapja el.
  • A float és double típusok végtelen állapotba kerülnek, amelyet a float.IsInfinity() és hasonló metódusokkal lehet vizsgálni.
double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
  • A decimal típusú számok OverflowException példányt váltanak ki.
  • Létezik egy megfelelő unchecked kulcsszó azokra az esetekre, amikor egy checked blokkon belül vissza szeretnéd fordítani az unchecked hatását, vagy amikor a fordító beállítását használtad.

A kivétel nélkül bekövetkező túlcsordulások problémásak lehetnek, mert általában igaz, hogy egy hibás állapotot minél korábban jelzünk, annál jobb.

Az int és a float túlcsordulási problémáit enyhítheted azzal, hogy az eredményt long, decimal vagy double típusú változóba mented.

Ha a kódodban elengedhetetlenek a nagy egészek, akkor a BigInteger típus használata is egy lehetőség.

Természetesen vannak olyan esetek, amikor jogos megengedni, hogy egy egész átforduljon, különösen előjel nélküli értékeknél. Klasszikus példa erre a hash-kódok esete, amelyek az egész szélességét egyfajta modulusként használják.

A kódbázisokban általában azt tapasztalod, hogy gyakran nincs ellenőrzés ott, ahol uint-ot vagy ulong-ot használnak azonosítóként, mert többszörös fáradságnak tartják, mint amennyit megér. Ez érvényes akkor is, amikor a felhasználási területből nyilvánvaló, hogy nem fognak nagyon nagy értékek előfordulni. De nézd meg ezt elrettentő példaként.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Túlcsordulás fogalmat