Namaran

Code daily. Without assist.

2026-09-19

divmod_sign.cpp

#include <iostream>

int main() {
    int a = -7 / 2;
    int b = -7 % 2;
    int c = 7 / -2;
    int d = 7 % -2;
    std::cout << a << " " << b << " " << c << " " << d << "\n";
}

これは何を出力するでしょうか?

Answer

-3 -1 -3 1(その後に改行)。C++11以降、整数の/は0方向への切り捨て(truncation)と規定されていて、実装依存だった時代の負の数の扱いはなくなりました。-7 / 2は数学的には-3.5ですが、0に近い方に切り捨てて-3になります。%(a / b) * b + a % b == aを満たすように定義されているので、a % bの符号は必ずa(被除数)と同じになります。-7 % 2-7 - (-3 * 2) = -17 % -27 - (-3 * -2) = 1です。商・余りのどちらも、割る数の符号ではなく被除数の符号に引きずられる、という点が直感に反しやすいところです。