Modulo mit negativen Zahlen



  • Hallo,

    ich hab mal ne einfache Frage:
    Warum liefert

    signed int i = -1;
     	std::cout << (i%13)<< std::endl;
    

    entgegen meiner Annahme -1 und nicht 12 zurück?

    Gruß,
    Modulo



  • Module liefert den Rest einer Integer Division:

    (-1)/13 = 0
    Der Rest ist dann (-1) - 0*13 = -1.
    Daher 😉

    Wenn du 12 willst machs so:

    int special_modulo(int a, int b)
    {
        int m = a % b;
        return m >= 0 ? m : m + b;
    }
    


  • Es sollte dennoch beachtet werden, sofern einer der Operanden negativ ist, ist das Vorzeichen des Restes implementationsspezifisch. Oder anderes formuliert, das Ergebnis hängt von den Operanden ab.

    Der Standard macht lediglich folgende Aussage

    (a/b)*b + a%b = a
    

    Und auf das Beispiel bezogen

    (-1/13)*13 + -1%13 = -1
    0*13 + -1%13 = -1
    -1%13 = -1
    

    Womit klar sein sollte, welches Ergebnis die Rechnung liefert. Damit kannst du auch mal testen, welches Ergebnis 1%-13 liefert.


Anmelden zum Antworten