BohYoh.comトップページへ
C & C++ FAQ
目次

C C++ 負数に対する除算の結果がおかしいのはどうしてですか。

C
 『一方のオペランドが負の値をもつ場合、/演算子の結果が代数的な商以下の最大の整数とするか、または代数的な商以上の最小の整数とするかは、処理系定義とし、%演算子の結果の符号も処理系定義とする。』と定義されています。
 たとえば-7を3で割った結果は処理系によって異なり、以下のようなパターンがあり得ることになります。
  ・-2あまり-1
  ・-3あまり2

C99
 『整数どうしの除算の場合、/演算子の結果は、代数的な商から小数部を切り捨てた値とする。』と定義されています。すなわち《0方向への切捨て》が行われます。
 たとえば-7を3で割った結果は、以下のようになります。
  ・-2あまり-1

C++
 『両方の演算対象が負でない場合、その剰余は、負ではない。そうでない場合の剰余の符号は,処理系定義とする。』と定義されています。
 たとえば-7を3で割った結果は処理系によって異なり、以下のようなパターンがあり得ることになります。
  ・-2あまり-1
  ・-3あまり2


■ 根拠 ■
標準C §6.3.5 Multiplicative operators
標準C99 §6.5.5 Multiplicative operators
標準C++ 1st §5.6 Multiplicative operators
標準C++ 2nd §5.6 Multiplicative operators

戻る

BohYoh.comロゴ