19

モジュロ演算子のいずれかのオペランドが負の場合に返される値をANSICが指定しなかったことを覚えているようです(一貫している必要があるというだけです)。後で指定されましたか、それとも常に指定されていて、間違って覚えていますか?

4

2 に答える 2

40

C89、完全ではありません(§3.3.5/ 6)。-5/10は0または-1を返すことができるため(、、およびを含む線形方程式で定義されます)、-5または5のいずれかになり%ます。/*+

整数が除算され、除算が不正確である場合、両方のオペランドが正の場合、演算子の結果は/代数商よりも小さい最大の整数であり、%演算子の結果は正です。 いずれかのオペランドが負の場合、演算子の結果が/代数商よりも小さい最大の整数であるか、代数の商よりも大きい最小の整数であるかは、演算子の結果の符号と同様に、実装によって定義され%ます。商a/bが表現可能である場合、式(a/b)*b + a%bはに等しくなりaます。

C99、はい(§6.5.5/ 6)、結果は-5でなければなりません:

整数を除算すると、/演算子の結果は、小数部分が破棄された代数商になります。88)a/bが表現可能である場合、式(a/b)*b + a%bはに等しくなりaます。

88)これはしばしば「ゼロへの切り捨て」と呼ばれます。


同様に、C ++ 98では、結果はC89の定義に従って実装定義(§5.6/ 4)になりますが、ゼロに丸めるルールが優先されることに言及しています。

...両方のオペランドが非負の場合、余りは非負です。そうでない場合、剰余の符号は実装定義です74)

74) ISO Cの改訂に向けて進行中の作業によると、整数除算に推奨されるアルゴリズムは、ISOFortran規格ISO/ IEC 1539:1991で定義されている規則に従います。この規則では、商は常にゼロに向かって丸められます。

そして実際、それはC ++ 0x(§5.6/ 4)の標準ルールになります。

...整数オペランドの場合、/演算子は小数部分が破棄された代数商を生成します。82 ..。

82)これは、ゼロへの切り捨てと呼ばれることがよくあります。

于 2010-08-31T13:47:28.413 に答える
3

KennyTMの答えに少し詳細を追加するには:C標準が定義された実装を呼び出す場合、その実装はそれが行う選択を文書化する必要があります。通常、これはコンパイラまたはライブラリのドキュメント(manページ、ヘルプマニュアル、印刷されたドキュメント、CDブックレット:-)にあります。C89以降への準拠を主張する実装は、これをどこかに提供する必要があります。そのようなドキュメントを探してみてください。gccたとえば、これはgcc-infoにあります。

4C実装定義の動作


ISO Cの適合実装は、「実装定義」と指定された各領域での動作の選択を文書化するために必要です。以下に、ISO / IEC 9899:1990およびISO / IEC 9899:1999規格のセクション番号とともに、そのようなすべての領域を示します。一部の領域は、標準の1つのバージョンでのみ実装定義されています。

一部の選択肢は、GCCが従うプラットフォーム(標準の文字エンコードを含む)に対して外部で決定されたABIに依存します。これらは、以下の「ABIによって決定された」としてリストされています。*バイナリ互換性:互換性、および「http://gcc.gnu.org/readings.html」に注意してください。いくつかの選択は、プリプロセッサのマニュアルに記載されています。*注実装定義の動作:(cpp)実装定義の動作。一部の選択は、ライブラリとオペレーティングシステム(または自立型環境用にコンパイルする場合は他の環境)によって行われます。詳細については、ドキュメントを参照してください。

  • メニュー:

  • 翻訳の実装::

  • 環境の実装::
  • 識別子の実装::
  • 文字の実装::
  • 整数の実装::
  • 浮動小数点の実装::
  • 配列とポインタの実装::
  • ヒントの実装::
  • 構造体共用体の列挙とビットフィールドの実装::
  • 修飾子の実装::
  • 宣言者の実装::
  • ステートメントの実装::
  • 前処理ディレクティブの実装::
  • ライブラリ関数の実装::
  • アーキテクチャの実装::
  • ロケール固有の動作の実装::
于 2012-12-23T17:16:20.747 に答える