Оператор% Java когда-либо переполняется?

В C и C++ поведение INT_MIN % -1 кажется неопределенным / зависимым от платформы согласно посту Шафика.

В Java переполняется ли оператор%?

Рассмотрим этот кусок кода:

public class Test {
    public static void main(String[] args) {
        // setup variables:
        byte b = Byte.MIN_VALUE % (-1);
        short s = Short.MIN_VALUE % (-1);
        int i = Integer.MIN_VALUE % (-1);
        long l = Long.MIN_VALUE % (-1);

        // my machine prints "0" for all:
        System.out.println(b);
        System.out.println(s);
        System.out.println(i);
        System.out.println(l);
    }
}

Есть ли независимая от платформы гарантия того, что приведенные выше результаты 0?

1 ответ

Решение

Посмотрите на раздел 15.17.3 JLS:

В C и C++ оператор остатка принимает только интегральные операнды, но в языке программирования Java он также принимает операнды с плавающей точкой.

Операция остатка для операндов, которые являются целыми числами после двоичного числового продвижения (§5.6.2), производит значение результата, такое, что (a/b)*b+(a%b) равно a. Эта идентичность сохраняется даже в частном случае, когда дивиденд является отрицательным целым числом наибольшей возможной величины для его типа, а делитель равен -1 (остаток равен 0). Из этого правила следует, что результат операции остатка может быть отрицательным, только если дивиденд является отрицательным, и может быть положительным, только если дивиденд является положительным;

Другие вопросы по тегам