2014-09-10 2 views
3

В C и C++ поведение INT_MIN % -1 представляется неопределенным/зависит от платформы в соответствии с Shafik's post.Является ли оператор% Java когда-либо переполнен?

В 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?

+0

Java в природе независим от платформы, поэтому я предполагаю (не проверено), что ответ ДА ​​ – shlomi33

ответ

6

Посмотрите на JLS section 15.17.3 он говорит:

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

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

+1

Я как раз собирался опубликовать это ^^ Почти все в JLS, особенно для таких вопросов. – Joffrey

+0

Извините @ Joffrey У меня была эта тема на моем экране, когда я читал этот вопрос: - $ –

+0

Ха-ха, это не проблема, дело здесь в том, чтобы получить ответ на вопрос, независимо от того, кто его пишет;) – Joffrey