Kezdőoldal » Számítástechnika » Programozás » Ebben az esetben túlcsordulás...

Ebben az esetben túlcsordulás történik? C, C++ kérdés.

Figyelt kérdés

Van 2db uint8 típusú változóm. Majd ezeknek az összeadását elmentem egy szintén uint8 típusú változóba.

x=200

y=200

z=x+y


Milyen eredményt fogok kapni?



nov. 30. 21:45
 1/9 anonim ***** válasza:
30%
Igen, túlcsordulás történik. 400-ból vonj ki 255-öt (uint8 maximuma), és megtudod.
nov. 30. 22:47
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:
És ez hibának számít fejlesztési és tesztelési területen?
nov. 30. 23:58
 3/9 A kérdező kommentje:
Beágyazott fejlesztési területen természetesen.
dec. 1. 00:34
 4/9 anonim ***** válasza:
10%

"És ez hibának számít fejlesztési és tesztelési területen?"


A példa amit felhoztál:

x=200, y=200, ha ezt a 2 számot összeadod a túlcsordulás miatt 144 lesz az eredmény.


Ez matematikailag korrekt szerinted? 200+200 = 144? Egyáltalán hogy lehetsz ilyen alacsony szellemi szinten, hogy felmerül benned az a kérdés, hogy ez hibának számít-e?

dec. 1. 01:12
Hasznos számodra ez a válasz?
 5/9 anonim ***** válasza:
74%
Ki lehet használni speciális esetekben, pl pont 255 db indexed van, és többször végig akarsz rajta menni (ring buffer). De hogy mondjam. Aki olvasni fogja a kódodat nagyon emlegetni fog.
dec. 1. 02:30
Hasznos számodra ez a válasz?
 6/9 anonim ***** válasza:
67%

Hogy hibának számít-e, az attól függ, hogy mit szeretnél elérni? Ha eleve az algoritmusodba beépíted ezt a tényt, hogy ez bizony túlcsordulhat, akkor egyáltalán nem hiba. Ha viszont te arra számítasz, hogy a 255 után 256 fog következni, akkor a túlcsordulás bizony hiba. Csak egy példa: titkosítani akarsz egy bájtsorozatot úgy, hogy minden értékhez hozzáadsz pl. 32-t. Ez esetben kifejezetten előnyös kihasználnod a túlcsordulás jelenségét, így nem kell külön vizsgálgatnod, hogy 223-nál nagyobb-e a bemenet, nem kell ez esetben még egy számítást elvégezned, hogy mennyi lesz így az értéke, hanem egyszerűen rábízhatod a rendszerre. És mivel ebben a struktúrában az összeadás invertálható, ezért a visszafejtés is ugyanilyen egyszerű lesz. (Nyilván komoly célra ez bóvli titkosítás lenne, de példának jó.)


#4 "Ez matematikailag korrekt szerinted?" Igen. De láthatóan te matematika alatt a 4 általánost érted. Nos, nézz utána a gyűrű nevű struktóráknak, és látni fogod!

dec. 1. 06:40
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:
22%
A zavaros, nem várt működést okozható kódot mindig hibaként kell kezelni és ennek megfelelően minél hamarabb kijavítani. Ha egy program működése azon alapul, hogy túlcsordulhat a kód, akkor annak a terveit újra kell gondolni.
dec. 1. 13:46
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:
51%

Hogy hiba-e nem tudjuk. Ez nagyon a környezettől függ. Bbeágyazott rendszereknél még mindig gyakori a 8 bites processzor használata. Ott nem tudsz mit kezdeni a túlcsordulással. Mert igen hamar túlcsordul a 8 bites Int. A hiba akkor "keletkezik" ha ezt a tervezésnél nem veszi figyelembe az ember (bár aki sok ilyet tervez annál ez már zsigerből megyen, és nem is írjuk le, mert annyira triviális dolog, hogy túl fog csordulni... kb. annyira szokásos ez mint az, hogy nappal világos van éjszak meg sötét /Magyarországon). A hiba akkor keletkezhet ebből ha nincs megfelelően kezelve, vagy nincs végig gondolva, hogy mi történik (történjen) a túlcsordulás esetén. Aki egészen sokat "tölt" 8 bites környezetben ez megszokottá válik. Az ember agyán átfut, hogy ez túl fog csordulni akkor mi van. 1./ nem okoz semmit, mert a túlcsordult eredmény is használható: nem foglalkozunk vele.

2./ Ha túlcsordul és okoz valamit akkor le kell kezelni (pl. megnézzük, hogy a művelet után mi van a carry flaggel /ezt az általam ismert összes rendszerben meg lehet nézni/ és a carry státusz értéke alapján vagy csinálunk valamit vagy nem. Pl. ha 8 bites a rendszerünk és kell nagyon, hogy a túlcsordulás után tudjuk, hogy "kéne egy 9. bit" akkor ezt el tudjuk pakolni egy külön "változóba" és onnan fel tudjuk használni. Másik lekezelés lehet, hogy exceptionra /vagy interuptra/ futtatjuk a kódot és akkor majd a magasabb szinten lévő cucc ezt az exceptiont kezeli valahogy. Bár sima összeadásnál ez elég ritka de láttam már ilyet is. Ehhez is jól használható a carry státusz.


De ez egy fejlesztői kérdés és feladat, hogy kitaláljuk, hogy mi legyen a túlcsordulás esetén. Mert ha 8 bites a processzor akkor az ott gyakori eset lesz. Mert azért a 8 bit az 8 bit.

dec. 1. 16:38
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:
A gyakorlatban természetesen túlcsordul. A szabvány szerint "undefined behaviour", bármi történhet. Ezt a fordítók sebességoptimalizálásra ki is szokták használni. Ha van egy ciklusod, aminek i>0 a feltétele, i előjeles ugyan, de csak növeled, akkor a fordító végtelen ciklusra optimalizálhatja. Annak ellenére, hogy i túlcsordulásakor negatív lesz.
dec. 23. 12:42
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!