1

重複の可能性:
Java の Mod が負の数を生成する

-16 mod 57 を印刷しようとすると、41 になるはずです。ただし、答えとして -16 が返され続けます。何を与える?

これが私のコードです:

public class TestMod {

public static void main(String[] args) {
    int number = -16;
    int mod = 57;
    int answer = number%mod;
    System.out.println(answer);

}

}
4

2 に答える 2

11

JLSから:

2 進数値昇格 (§5.6.2) 後の整数であるオペランドの剰余演算は、(a/b)*b+(a%b) が a に等しいような結果値を生成します。

-16例の数字を置き換えると、それが言語仕様で義務付けられていることがわかります。

この恒等式は、被除数がその型で可能な最大の大きさの負の整数で、除数が -1 (剰余が 0) であるという特別な場合でも保持されます。

この規則から、剰余演算の結果は、被除数が負の場合にのみ負になる可能性があり、被除数が正の場合にのみ正になる可能性があることがわかります。さらに、結果の大きさは常に除数の大きさよりも小さくなります。

期待する結果を得る方法は次のとおりです。

public static void main(String[] args) {
    int number = -16;
    int mod = 57;
    int answer = ((number % mod) + mod) % mod;
    System.out.println(answer);

}
于 2013-01-21T19:41:32.707 に答える
3

最初のオペランドが負の場合、剰余演算子%は負の結果を返します。これは、多くの言語で一般的な動作です。

于 2013-01-21T19:41:04.363 に答える