1. ホーム
  2. c++

[解決済み] 負の値を持つモジュロ演算子【重複】について

2022-03-09 18:42:36

質問

なぜ、そのような操作をするのか。

std::cout << (-7 % 3) << std::endl;
std::cout << (7 % -3) << std::endl;

は、異なる結果をもたらすのでしょうか?

-1
1

解決方法は?

ISO14882:2011(e) 5.6-4より。

<ブロッククオート

二項演算子 / は商を、二項演算子 % は商を生成します。 で割った余りを出力します。 2番目。または % の第 2 オペランドが 0 の場合、動作は次のようになります。 は未定義です。積分オペランドに対して、/演算子は、分数部分を捨てた代数商を生成します。 結果の型で表現可能な場合,(a/b)*b + a%b は a と等しくなります.

あとは基本的な数学です。

(-7/3) => -2
-2 * 3 => -6
so a%b => -1

(7/-3) => -2
-2 * -3 => 6
so a%b => 1

注意点

オペランドの両方が非負であれば、余りは非負になります。 でない場合は、余りの符号は実装で定義されます。

ISO14882:2003(e)にあったものは、ISO14882:2011(e)にはもう存在しない。