Почему переменная типа long дает разные ответы после приведения и до приведения в следующем коде, поскольку оба типа имеют тип long? - PullRequest
2 голосов
/ 20 февраля 2020
byte byteChallenge = 68;
short shortChallenge = 190;
int intChallenge = 2147483647;

long longChallenge = (50000L + 10L * (byteChallenge + shortChallenge + intChallenge));

long longChallengeX = 50000L + 10L * ((long) byteChallenge + (long) shortChallenge + (long) 
                          intChallenge);

System.out.println(longChallenge);
System.out.println(longChallengeX);

Вывод, который я получаю:

-21474783910
21474889050

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Хитрая часть - это int intChallenge = 2147483647 константа, которая является максимальным значением для положительного значения int (см. Integer.MAX_VALUE).

Когда вы выполняете byteChallenge + shortChallenge + intChallenge, это оператор int arithmeti c, который приводит к целочисленному переполнению . В вашем примере результатом целочисленного переполнения является отрицательное число.

Когда вы выполняете (long) byteChallenge + (long) shortChallenge + (long) intChallenge, это long arithmeti c. Поскольку long поддерживает гораздо большие значения, чем int, переполнения нет.

1 голос
/ 20 февраля 2020

В первом сценарии подвыражение (byteChallenge + shortChallenge + intChallenge) в основном равно "byte + short + int". Java сначала оценивает эту часть, а затем умножает на 10 и добавляет к 50000.

Поскольку подвыражение не включает тип long, Java не имеет смысла делать тип результата выражение long, поэтому первые два операнда переводятся только в int, а три int добавляются вместе, чтобы получить еще один int. Это вызывает переполнение, что делает результат очень отрицательным.

Во втором случае вы явно приводите все три операнда к long перед тем, как с ними работать, поэтому тип подвыражения разрешается равным long.

Урок здесь заключается в том, что вложенные выражения обрабатываются так же, как и любые другие выражения. (byteChallenge + shortChallenge + intChallenge) не получает особого отношения только потому, что оно умножено на long. Его значение по-прежнему оценивается так же.

...