Heim  >  Artikel  >  Backend-Entwicklung  >  Wie geht der Moduloperator mit negativen Zahlen in C/C /Obj-C um?

Wie geht der Moduloperator mit negativen Zahlen in C/C /Obj-C um?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-08 03:56:01382Durchsuche

How Does the Modulus Operator Handle Negative Numbers in C/C  /Obj-C?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn