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