kostenloser Webspace werbefrei: lima-city


Overflow

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    seth93

    seth93 hat kostenlosen Webspace.

    Hey,

    lese mir grad ein Tutorial über C++ durch.
    Da ist folgende Aufgabe:

    Schreibe eine Schleife in der eine Zahl (Startwert ist 2) mit sich selbst sooft multipliziert wird (also immer hoch 2 genommen), bis es einen overflow gibt. Lass dir jeweils das Ergebnis ausgeben und mache diese Schleife für die Datentypen short, int, unsigned und long.


    Lösung ist auch mti dabei, allerdings versteh ich sie nicht:

    #include<iostream>
        using namespace std;
    
        int main()
        {
                cout<<"short:\n";
                short i=2;
                while(1) {
                    short t=i*i;
                    if(t<=i) break;
                    i=t;
                    cout<<i<<"\n";
    }


    Das Ergebnis ist 256.
    Heißt es, dass wenn man 256^2 nehmen würde, es zu einem Overflow kommt?

    Den Lösungsweg versteh ich ebenfalls nicht.
    Wieso ist es ein Overflow, wenn i größer als t ist?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. seth93 schrieb:
    [...]
    Heißt es, dass wenn man 256^2 nehmen würde, es zu einem Overflow kommt?
    [...]


    genau, da der short datentyp nur bis 32.767 geht 256^2 aber 65.536 ist.

    der overflow hat nichts mit dem verhältnis zwischen i und t zu tun. sobald der datentyp von t die quadrierung von i nicht mehr fasse kann kommt es zu einem overflow ( zu deutsch ein "überlauf").

    edit: oder wie Wikipedia sagen würde:
    Solch ein Überlauf tritt auf, wenn das Ergebnis einer Berechnung für den gültigen Zahlenbereich zu groß ist, um noch richtig interpretiert werden zu können.


    mfg

    Beitrag zuletzt geändert: 30.5.2010 17:24:12 von syberpsace
  4. Hm mir fällt auf, dass da eine schließende Klammer am while fehlt aber da du es ja schon probiert hast, denke ich, dass es bei dir richtig ist. Zu dem Problem mit dem Vergleich mit i und t ist folgendes zu sagen:
    Du belegst t immer mit i*i. Wie syberpsace schon sagte ist der short Datentyp begrenzt auf 32.767. Wenn du ein Ergebnis berechnest, das größer ist, wird die sogenannte Modularithmetik angewandt. Im Prinzip heißt das, dass du wieder vom unteren ende des Zahlenbereichs einfängst. Hättest du Beispielsweise einen Datentyp, der von 0 bis 10 geht und würdest 5 und 6 addieren, so kämst du auf 11. Da der Datentyp aber nur 10 fassen könnte, würde einfach wieder von unten angefangen und praktisch einen Schritt weitergegangen also auf die 0.
    Dies führt im Beispielcode dazu, dass die Zahl t wieder am unteren Rand des Wertebereichs anfängt und somit kleiner als i ist, wenn ein Overflow eingetreten ist.
  5. Also: Für den Datentyp Short-Integer werden 16 Bit(2 Byte) im Speicher reserviert. Diese können nun vom Programm beschrieben werden. Beispielsweise wird für eine 1 der Binärwert 0000 0000 0000 0001 in den im Arbeitsspeicher reservierten Platz geschrieben. Für eine 2 der Binärwer 0000 0000 0000 0000 0010, für eine 3 eine 0000 0000 0000 0011, und so weiter. Das Programm reserviert also genug Speicher, um Binär 1111 1111 1111 1111 in den Speicher zu schreiben, also 0 - 65.535(2^16) wenn man ohne Vorzeichen arbeitet, -32.768 bis +32.768(2^15) wenn man mit vorzeichen arbeitet, wobei da das erste bit als Vorzeichenplatzhalter steht. So ist dann (glaube ich) 1111 1111 1111 1111 = -32.768, 0000 0000 0000 0000 = 0 und 0111 1111 1111 1111 = +32.768. Das erste Bit zeigt also nur an, ob es +(0) oder -(1) ist.
    Der "overflow" kommt zustande, wenn das Programm nicht genug Speicher reserviert hat, um die Zahl in den Speicher zu schreiben. Für eine 65.536 bräuchte man 17 Bit um sie zu speichern, womit der im Speicher reservierte Platz nicht mehr ausreicht. Betrachtet man den Speicher, sieht das ganze in etwa so aus:
    [ Byte  ] [      Short      ] [      Short      ]
    0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
    Also jede Variable hat ihren fest zugewiesenen Platz im Speicher und eine dementsprechende Adresse, womit die Software auf diesen Speicher zugreifen kann. Wenn man nun also den mittleren "short"-Wert beschreiben möchte, weiss das Programm, dass dieser Wert imm im zweiten Byte beginnt, also die Adresse "2" hat. Der zweite "short"-Wert hat die Adresse "4" und so weiter. Um jetzt plötzlich 17 Bit anstelle von 16 Bit in den mittleren Short-Wert zu schreiben, müsste es entweder schon im Byte vorher anfangen, oder in das nächste Byte schreiben - oder es adressiert alle folgenden Werte um. Dies sieht in unserem Beispiel natürlich noch einfach aus, da aber im Arbeitsspeicher nicht nur 3 Werte liegen, sondern durchgängig sicher so um die 10 Millionen, wäre das doch recht viel Aufwand.

    Also kurz: Du legst den verfügbaren Speicher durch das gewählte Datenfprmat fest. Ein "char"-Wert reserviert einen Byte, ein "short"-Wert zwei Byte, ein int vier Byte, ein Long-Wert acht Byte... Und so weiter. Die daraus entstehenden maximalen Werte entsprechen dem dafür verfügbaren Platz. (Mehr dazu hier)
  6. Hm bei int möchte ich mal auf die bekannten Architekturprobleme hinweisen.
    Leider sind die Datentypen nicht immer gleichgroß, was zu Problemen führen kann.
  7. Autor dieses Themas

    seth93

    seth93 hat kostenlosen Webspace.

    OK, vielen Dank für die Antworten, waren alle sehr hilfreich :)
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!