Frage zur Operator-Arithmetik



  • Hallo Leute,

    ich hab folgenden C-Code, was mir die Zweierpotenzen ausgeben soll.

    #include <math.h>
    int main(void)
    {
             int zahl,c = 2;
             zahl = c;
            while(1)
            {
                    zahl = 2*zahl;
                    printf("Potenz: %d\n",zahl);
            }
    }
    

    Doch ich frage mich, warum er mir 0er liefert.

    Wie würde die Operator Arithmetik dazu aussehen.

    Danke

    Gruß

    rubix



  • Doch ich frage mich, warum er mir 0er liefert.

    Falsch. Die ersten Ausgaben sind nicht 0. Desweiteren bedeutet 'mal 2' ein Shift um 1 nach links. Wenn alles herausgeschiftet ist, dann bleibt nur 0 uebrig.



  • Oh mann ja klar. Danke schön für die Antwort


  • Mod

    knivil schrieb:

    Doch ich frage mich, warum er mir 0er liefert.

    Falsch. Die ersten Ausgaben sind nicht 0. Desweiteren bedeutet 'mal 2' ein Shift um 1 nach links. Wenn alles herausgeschiftet ist, dann bleibt nur 0 uebrig.

    Wenn der Datentyp jetzt aber keinen Maximalwert hätte, der gleichzeitig eine Zweierpotenz wäre, dann würde die Erklärung nicht mehr funktionieren. Es käme aber auch nicht 0 heraus.

    Bessere Erklärung:
    Angenommen ein Integer hat 32 Bit. Dann ist 2 hoch 31 - 1 (also 2,147,483,647) die größte darstellbare positive Zahl. Bei 2 ^ 31 wird umgebrochen und es geht bei der kleinsten darstellbaren Zahl weiter, also -2,147,483,648, die du auch ausgegeben bekommen solltest für 2^31. -2,147,483,648 * 2 ist dann natürlich auch wieder zu klein für den Integer, also geht's wieder von oben los, dieses Mal um 2,147,483,648 Schritte in die andere Richtung gezählt. Und das ist dann genau 0. Von da an ist 2*0 immer 0.

    P.S.: Eigentlich ist (signed) Integerüberlauf sowieso undefiniert, aber ich betrachte hier mal das übliche Verhalten.

    P.P.S.: Es ist übrigens ein allgemeiner Irrtum, dass man math.h bräuchte, weil man rechnet. Rechenoperationen sind eingebaut. In math.h sind komplexe Funktionen wie sin, log, exp & Co. deklariert. Hingegen brauchst du aber noch stdio.h, um printf richtig nutzen zu können.


Log in to reply