モジュロ演算子の結果が負の値になるのはなぜですか? [重複] 質問する

モジュロ演算子の結果が負の値になるのはなぜですか? [重複] 質問する

なぜこのような操作を行うのか:

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

異なる結果が得られますか?

-1
1

ベストアンサー1

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

二項演算子 / は商を生成し、二項演算子 % は最初の式を 2 番目の式で割った余りを生成します。/ または % の 2 番目のオペランドがゼロの場合、動作は未定義です。整数オペランドの場合、/ 演算子は小数部分を破棄した代数商を生成します。商 a/b が結果の型で表現可能な場合、(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) に​​は存在しません。

おすすめ記事