엄밀한 정의는 더 복잡하지만, 정수의 모듈러 연산 $A \bmod B$는 대충 이렇게 정의할 수 있습니다.
$$ A \bmod B = sgn(B) \times \left\lparen A - \left\lparen \left\lfloor \frac{A}{\left\lbrack B \right\rbrack} \right\rfloor \times \left\lbrack B \right\rbrack \right\rparen \right\rparen $$
$B = 2$ | $B = 3$ | $B = -2$ | $B = -3$ | |
---|---|---|---|---|
$A = 4$ | 0 | 1 | 0 | -1 |
$A = 3$ | 1 | 0 | -1 | 0 |
$A = 2$ | 0 | 2 | 0 | -2 |
$A = 1$ | 1 | 1 | -1 | -1 |
$A = 0$ | 0 | 0 | 0 | 0 |
$A = -1$ | 1 | 2 | -1 | -2 |
$A = -2$ | 0 | 1 | 0 | -1 |
$A = -3$ | 1 | 0 | -1 | 0 |
양수의 모듈러 연산은 C의 signed integer가 표현 범위를 벗어날 때의 동작과 같습니다.
나머지 연산은 말 그대로 나머지 연산을 말합니다. 여기서 $A // B$는 나눗셈의 몫 A / B
입니다.
$$ A // B = sgn(AB) \times \left\lfloor \left\lbrack \dfrac{A}B \right\rbrack \right\rfloor \newline A \mathbin{\%} B = A - \left\lparen A // B \right\rparen \times B $$
$B = 2$ | $B = 3$ | $B = 2$ | $B = -2$ | |
---|---|---|---|---|
$A = 4$ | 0 | 1 | 0 | 1 |
$A = 3$ | 1 | 0 | 1 | 0 |
$A = 2$ | 0 | 2 | 0 | 2 |
$A = 1$ | 1 | 1 | 1 | 1 |
$A = 0$ | 0 | 0 | 0 | 0 |
$A = -1$ | -1 | -1 | -1 | -1 |
$A = -2$ | 0 | -2 | 0 | -2 |
$A = -3$ | -1 | 0 | -1 | 0 |
A와 B가 모두 양수일 때는 모듈러와 나머지가 같지만. 그 외의 경우에는 결과가 다릅니다.
A가 음수일 때도 $\left\lparen A + 1 \right\rparen \bmod B$는 $\left\lparen A \bmod B \right\rparen + 1$ 또는 $0$이 됩니다.
B가 음수일 때 $A \bmod B$는 $-\left\lparen A \bmod -B \right\rparen$와 같습니다.
A가 음수일 때 $A \mathbin{\%} B$는 $-\left\lparen -A \mathbin{\%} B \right\rparen$와 같습니다.
B가 음수일 때 $A \mathbin{\%} B$는 $A \mathbin{\%} -B$와 같습니다.
int의 오버플로우가 위험한 이유 - unsigned int의 동작을 잠깐 다룹니다.