Modulusoperator zur Behandlung negativer Zahlen in C/C /Obj-C
Anders als in der Mathematik ist der Moduloperator (%) in C- Abgeleitete Sprachen zeigen ein inkonsistentes Verhalten, wenn sie auf negative Zahlen angewendet werden. Diese Diskrepanz ergibt sich aus der Mehrdeutigkeit, die das Vorzeichen des Restes umgibt.
Implementierungsdefiniertes Verhalten
Gemäß dem C 03-Standard das Vorzeichen des Restes, wenn beide Operanden negativ sind, ist durch die Implementierung definiert. Dies bedeutet, dass verschiedene Compiler und Plattformen möglicherweise unterschiedliche Ergebnisse für Operationen wie (-1) % 8 und fmodf(-1, 8) liefern.
Zuverlässiger Ausdruck
Unabhängig von der Implementierung gilt folgender Ausdruck:
(a / b) * b + (a % b) == a
Dieser Ausdruck besagt, dass der Dividend (a) aus dem Quotienten (a / b) und dem Rest (a % b) rekonstruiert werden kann.
Lösung
Ein Ansatz, um ein konsistentes Verhalten für negative Operanden sicherzustellen, besteht darin, den Rest wie folgt zu berechnen:
<code class="cpp">int mod(int a, int b) { if (b < 0) return -mod(-a, -b); int ret = a % b; if (ret < 0) ret += b; return ret; }</code>
Diese Funktion verarbeitet negative Operanden nach Negieren beider Operanden für den Fall, dass b negativ ist. Der Rest wird als % b berechnet. Wenn der Rest negativ ist, wird er durch Addition des Absolutwerts von b angepasst. Dadurch wird sichergestellt, dass das Ergebnis ein nicht negativer Rest ist, der den oben genannten zuverlässigen Ausdruck erfüllt.
Auf diese Weise würde mod(-1, 8) 7 zurückgeben und mod(13, -8) würde - 3, Einhaltung des erwarteten mathematischen Verhaltens.
Das obige ist der detaillierte Inhalt vonWie geht der Moduloperator mit negativen Zahlen in C/C /Obj-C um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!