Gyakori hibák: Túlcsordulás
A programozásban túlcsordulásnak nevezzük azt a jelenséget, amikor egy adott helyre (pl.: egy változóba) több, vagy nagyobb értéket próbálunk írni, mint amekkora belefér. Ez a cikk az egyszerű adattípusok túlcsordulásával foglalkozik. A verem túlcsordulásról itt olvashatsz: Gyakori hibák: Veremtúlcsordulás
Szeretnél az ünnepek alatt is gyakorolni? Vár az Easter Bug Hunt játékunk! Csatlakozz, és keresd meg az összes hibát - akár még jutalom is ütheti a markod!
Irány a játékBár a túlcsordulás jelenségével általában az int adattípusnál találkozunk a leggyakrabban, mégis kezdjük a dolog megértését először a byte adattípussal, mert ezt a méretéből adódóan valamivel egyszerűbben tudjuk szemléltetni. Hozzunk létre egy byte típusú változót, és írjuk bele például a 255-öt.
Mint az összefoglaló táblázatban láthatjuk (Lásd: Változók, adattípusok), a byte egy 8 biten tárolódó előjel
nélküli egész szám. A 255 kettes számrendszerbe konvertálva 11111111
, ami mindössze 8 számjegy, tehát tökéletesen
a 8 bitnyi helyen. A számunkat tehát letároltuk, nincs semmi probléma. Ha szeretnél kísérletezni a számrendszerek közötti
átváltással, próbáld ki a kalkulátorunkat, és nézd meg, hogy melyik számok hány bitnyi helyet foglalnak!
Most próbáljuk meg letárolni a 256-ot. Az előzőhöz hasonlóan, ezt is átalakítjuk kettes számrendszerűvé, ami 100000000
lesz... És itt a probléma! Ez ugyanis már 9 bit helyet foglal...na, azonban nekünk csak 8 bit áll rendelkezésre, így tároláskor a legelső (bal oldali) bit értéke elveszik. Így tehát a programunk csak a 00000000
értéket fogja letárolni, ami viszont 0, és nem 256. A byte változónk tehát túlcsordult, azaz elértük a változónk felső határát, és ahogy átléptük azt, hirtelen egy kisebb számot kaptunk.
A jelenség az előjeles egész változók esetén (sbyte, short, int, long) annyiban más, hogy a túlcsordulás hatására ezen változótípusoknál nem a 0-hoz jutunk vissza, hanem az adott adattípusban tárolható legkisebb számhoz, ami ugyebár egy negatív szám.
Minél több bájton tárolódik a változónk, annál később érjük el a benne tárolható számok maximumát, azaz annál később kezd el az értékünk túlcsordulni - ezért is érdemes ügyelni a megfelelő változótípus használatára!