C/C で負の数を処理する係数演算子 /Obj-C
数学とは異なり、C の係数演算子 (%) は派生言語は、負の数に適用すると一貫性のない動作を示します。この矛盾は、剰余の符号をめぐる曖昧さから生じます。
実装定義の動作
C 03 標準によれば、両方のオペランドが一致する場合の剰余の符号は、負の場合は実装定義です。これは、コンパイラやプラットフォームが異なると、(-1) % 8 や fmodf(-1, 8) などの操作でさまざまな結果が生成される可能性があることを意味します。
信頼性のある式
実装に関係なく、次の式が当てはまります:
(a / b) * b + (a % b) == a
この式は、被除数 (a) が商 (a / b) と剰余 (a % b) から再構築できることを示しています。
解決策
負のオペランドの一貫した動作を保証する 1 つのアプローチは、次のように剰余を計算することです。
<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>
この関数は、負のオペランドを次のように処理します。 b が負の場合、両方のオペランドを否定します。残りは a % b として計算されます。余りが負の場合は、b の絶対値を加算して調整します。これにより、結果が前述の信頼できる式を満たす非負の剰余であることが保証されます。
このようにして、mod(-1, 8) は 7 を返し、mod(13, -8) は - を返します。 3、期待される数学的動作に準拠します。
以上がモジュラス演算子は C/C /Obj-C で負の数をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。