ここでは剰余の数学的定義が必要です。
2 つの整数m、dが与えられた場合、 rが 2 つの条件を満たす 場合、rはmとdの除算の剰余であると言います。
- となる別の整数kが存在します
m == k * d + r
。
0 <= r < d
.
Cでは、上記の定義に従うだけでm % d == r
とが得られます。
ご覧のとおり、切り捨てはまったくありません (つまり、「切り捨て」は定義の結果です)。 m / d == k
定義から、3 % 2 == 1 および 3 / 2 == 1 が得られます。
その他の例:
4 / 3 == 1 および 5 / 3 == 1 ですが、5.0/3.0 == 1.6666 にもかかわらず (これは 2.0 に丸められます)。
4 % 3 == 1 および 5 % 3 == 2.
r = m - k * d
C では次のように書かれて いる式も信頼できます。
m % d == m - (m / d) * d
ただし、標準 C では、整数除算は次の規則に従いますround to 0
。
したがって、負のオペランドでは、C は数学的なものとは異なる結果を提供します。
次のようになります。
(-4) / 3 == -1, (-4) % 3 == -1 (C では) ですが、普通の数学では (-4) / 3 = -2, (-4) % 3 = 2.
普通の数学では、剰余は常に非負であり、abs(d)
.
標準 C では、剰余は常に最初の演算子の符号を持ちます。
注: この説明 (負の場合) は、標準の C99/C11 のみを対象としています。コンパイラのバージョンに注意し、いくつかのテストを行う必要があります。