Maison > développement back-end > C++ > Comment l'opérateur de module gère-t-il les nombres négatifs dans C/C/Obj-C ?

Comment l'opérateur de module gère-t-il les nombres négatifs dans C/C/Obj-C ?

Patricia Arquette
Libérer: 2024-11-08 03:56:01
original
415 Les gens l'ont consulté

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

Opérateur de module gérant les nombres négatifs en C/C /Obj-C

Contrairement aux mathématiques, l'opérateur de module (%) en C- les langages dérivés présentent un comportement incohérent lorsqu’ils sont appliqués à des nombres négatifs. Cet écart résulte de l'ambiguïté entourant le signe du reste.

Comportement défini par l'implémentation

Selon la norme C 03, le signe du reste lorsque les deux opérandes sont négatifs est défini par l’implémentation. Cela signifie que différents compilateurs et plates-formes peuvent produire des résultats variables pour des opérations telles que (-1) % 8 et fmodf(-1, 8).

Expression fiable

Quelle que soit la mise en œuvre, l'expression suivante est vraie :

(a / b) * b + (a % b) == a
Copier après la connexion

Cette expression indique que le dividende (a) peut être reconstruit à partir du quotient (a / b) et du reste (a % b).

Solution

Une approche pour garantir un comportement cohérent pour les opérandes négatifs consiste à calculer le reste comme suit :

<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>
Copier après la connexion

Cette fonction gère les opérandes négatifs par nier les deux opérandes dans le cas où b est négatif. Le reste est calculé en % b. Si le reste est négatif, il est ajusté en ajoutant la valeur absolue de b. Cela garantit que le résultat est un reste non négatif qui satisfait l'expression fiable mentionnée ci-dessus.

De cette façon, mod(-1, 8) renverrait 7 et mod(13, -8) renverrait - 3, adhérant au comportement mathématique attendu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal