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
502 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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal