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) = -1、7 % -2は7 - (-3 * -2) = 1です。商・余りのどちらも、割る数の符号ではなく被除数の符号に引きずられる、という点が直感に反しやすいところです。