ホームページ > バックエンド開発 > C++ > モジュラス演算子は C/C /Obj-C で負の数をどのように処理しますか?

モジュラス演算子は C/C /Obj-C で負の数をどのように処理しますか?

Patricia Arquette
リリース: 2024-11-08 03:56:01
オリジナル
411 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート