Java Кастинг недопонимания для меня - PullRequest
1 голос
/ 28 февраля 2020

Я новичок в java, и я не понимаю различий между этими двумя:

        byte myByte = 100;
        short myShort = 5000 ;
        int myInt = 2_000_150_000;

        long myLong = (long)(50_000 + 10*(long)(myByte + myShort + myInt));
        System.out.println("test1:" + myLong);

        long myLongWrong = (long)(50_000 + 10*(myByte + myShort + myInt));
        System.out.println("test2:" + myLongWrong);

OUTPUT:

    test1:20001601000
    test2:-1473235480

Я знаю, когда я получаю var и arithmeti c Мне нужно делать кастинг с (долго) но зачем мне это делать и вне main () тоже?

ЖЕ ДУМАЕТЕ ЗА короткую работу иначе

    short myShortTest = (short)(50_000 + 10*(short)(myByte + myInt +myShort));
    short myShortTest2 = (short)(50_000 + 10*(myByte + myInt +myShort));
    System.out.println(myShortTest);
    System.out.println(myShortTest2);

ВЫХОД

13800
13800

Спасибо за помощь я новичок для java не убивай меня :)

Ответы [ 2 ]

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

Всякий раз, когда происходит переполнение, int перемещается на другой конец границы, как видно из выходных данных следующей программы:

public class Main {
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MAX_VALUE + 1);
        System.out.println(Integer.MIN_VALUE);
        System.out.println(Integer.MIN_VALUE - 1);
    }
}

Выход:

2147483647
-2147483648
-2147483648
2147483647
  • В случае test1 из-за приведения к long результат промежуточного вычисления [10*(long)(myByte + myShort + myInt)] был сохранен как long, который может вместить результат без переполнение и, следовательно, вы получили правильное значение.
  • В случае test2 при отсутствии правильного приведения результат промежуточного вычисления [10*(myByte + myShort + myInt)] был сохранен как int, но значение переполнилось для int и, следовательно, вы получили отрицательное значение.
2 голосов
/ 28 февраля 2020

Ваша первая версия гласит: сложите мои переменные, обработайте результат как длинный, умножьте на 10, добавьте 50000 и обработайте его как длинный.

Ваша вторая версия читает: сложите мои переменные (результат является целым числом), умножьте на 10 (которое все еще является целым, но может быть переполнено), добавьте 50000 (все еще возможно переполненное целое число) и обработайте это как длинное.

Таким образом, ваша первая версия начинает обрабатывать сумма как длинное значение и резервирует достаточное количество памяти, в то время как ваша вторая версия выполняет этот шаг в самом конце, работая с меньшим объемом памяти до тех пор.

...