20

(-x) % m、ここで、xおよびはc ++標準m(c ++ 0x)で正であり、負であり、に等しいことが保証されていますか?-(x % m)

私はそれが私が知っているすべてのマシンで正しいことを知っています。

4

2 に答える 2

11

Luchianの答えに加えて、これはC++11標準の対応する部分です。

二項/演算子は商を生成し、二項%演算子は、最初の式を2番目の式で除算した余りを生成します。/または%の第2オペランドがゼロの場合、動作は未定義です。整数オペランドの場合、/演算子は、小数部分が破棄された代数商を生成します。商a/bが結果のタイプで表現できる場合、(a / b)* b + a%bはaに等しくなります。

これは最後の文を逃します。だからその部分

(a / b)* b + a%bはaに等しい

に依存する唯一の参照であり、これは、の切り捨て動作を考えると、a % b常にの符号を持つことを意味します。したがって、実装がこの点でC ++ 11標準に準拠している場合、モジュロ演算の符号と値は実際に負のオペランドに対して完全に定義されます。a/

于 2012-10-03T14:51:01.490 に答える
7

5.6乗法演算子

4)二項/演算子は商を生成し、二項%演算子は、最初の式を2番目の式で除算した余りを生成します。/または%の第2オペランドがゼロの場合、動作は未定義です。それ以外の場合、(a / b)* b + a%bはaに等しくなります。両方のオペランドが非負の場合、余りは非負です。そうでない場合、剰余の符号は実装によって定義されます(私の強調)

ただし、これはC++03からのものです。:(

于 2012-10-03T14:41:31.690 に答える