C がモジュロ演算子に対して負の数値を出力する理由
数学では、両方のオペランドが次の場合、モジュロ演算の結果は非負の値になります。非否定的。ただし、C では、一方または両方のオペランドが負の場合、modulo は負の数を出力します。
ISO/IEC 14882 仕様
ISO/IEC 14882:2003(E )、モジュロ演算子は、最初のオペランドを 2 番目のオペランドで除算した余りを求めます。 2 番目のオペランドが負の場合、結果の符号は実装で定義されます。
C 実装の理論的根拠
C 実装は、「ゼロ方向の丸め」アルゴリズムに従います。 ISO/IEC 1539:1991 で定義されています。このアルゴリズムは、除算の商をゼロに向かって丸めるため、負の数値は正の数値に丸められます。その後、リマインダーは、元の被除数と、商と除数の積との差として計算されます。
アーキテクチャ上の考慮事項
x86 プロセッサでは、整数の除算と剰余は次のようになります。 「idiv」(符号なし値の場合は「div」)と呼ばれる単一の命令によって実行されます。この命令は、商と剰余の両方を別々のレジスタに生成します。
効率と互換性の優先
C および C は、数学的正確さよりも効率と互換性を優先します。整数の除算と剰余は頻繁に使用される演算であり、プロセッサの idiv 命令を使用してこれらを効率的に実装すると、実装が簡素化され、オーバーヘッドが削減されます。
さらに、C との互換性を維持することで、C コードが既存の C コードベースと簡単に接続できるようになります。
データ構造への影響Access
モジュロを使用してデータ構造の要素にアクセスする場合、結果が負でないことを確認することが重要です。負の値が生じる可能性がある場合、結果を正のインデックスに変換するために追加のロジックが必要になる場合があります。
代替実装
一方、ISO/IEC 標準では、モジュロでは常に正の値を返す必要があるため、一部の言語では別のアプローチが選択されています。たとえば、Python の % 演算子は、オペランドが負の場合でも常に負ではない値を返します。
結論
モジュロ演算子の C 実装は負の数値を出力します。アーキテクチャ上の考慮事項、ISO/IEC 標準への準拠、および効率と互換性の優先順位の組み合わせにより、一方または両方のオペランドが負の場合。 C. この動作は、特定の状況では直観に反するように見えるかもしれませんが、C 言語の設計で行われた実際の実装上の選択を反映しています。
以上がC のモジュロ演算子が時々負の数を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。