Оператор% 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). Из этого правила следует, что результат операции остатка может быть отрицательным, только если дивиденд является отрицательным, и может быть положительным, только если дивиденд является положительным;