Добавление любого значения к максимальному целочисленному значению дает неправильный расчет
Я добавляю два числа 2147483647 и 45
public void checkIntAdd(){
int intMax = 2147483647;
int anyNumber = 26;
int number = intMax+anyNumber;
System.out.println("Wrong Calculation -"+number);
}
Ответим мы должны
"2147483692
"но это идет как
-2147483604
что я в порядке с этим, что он теряет какое-то значение
но когда я попробовал этот тип вещей с коротким, это дает ошибку компиляции как
public void checkShortAdd(){
short intMax = 214;
short anyNumber = 26;
short number = intMax+anyNumber; // error is coming Type mismatch: cannot convert from int to short
System.out.println("Wrong Calculation -"+number);
}
// приходит ошибка Несоответствие типов: невозможно преобразовать из int в short
я не могу понять причину этого.
когда я добавляю актерский состав, он отлично работает
short number = (short) (intMax+anyNumber);
Аналогично, добавление int должно выдавать ошибку компилятором, чтобы пользователь мог позаботиться о том, чтобы он вышел за границы, как в случае короткого замыкания.
3 ответа
Число 1: первое число - это максимальный целочисленный размер в Java. Вы можете получить это с
Integer.MAX_VALUE
Ты можешь использовать
BigInteger reallyBig = new BigInteger("1234567890123456890");
Номер 2: в Java, это лежит в основе кодирования языка. Упрощенно, вы можете сказать, что short + short = int, поэтому вы должны привести его к правильному решению.
Источник: https://www.reddit.com/r/learnprogramming/comments/3refus/in_java_why_is_the_sum_of_2_shorts_an_int/
TL, DR...
это действительно short intMax = 214;
потому что даже ты 214 является литералом int, он вписывается в рамки короткого..., то же самое для short anyNumber = 26;
Теперь Java-компилятор не может гарантировать, что это
short number = intMax + anyNumber;
все еще может соответствовать короткой переменной, поэтому вам нужно привести
short number = (short) (intMax + anyNumber);
Согласно спецификации языка Java
Большинство инструкций в наборе команд виртуальной машины Java кодируют информацию о типе операций, которые они выполняют. Например, инструкция iload (§iload) загружает содержимое локальной переменной, которая должна быть int, в стек операндов. Инструкция fload (§fload) делает то же самое со значением типа float. Эти две инструкции могут иметь идентичные реализации, но иметь разные коды операций.
в этой таблице нет операции для короткого байтового символа.
Отображение между фактическими типами виртуальной машины Java и вычислительными типами виртуальной машины Java как
в котором говорится, что короткий тип по умолчанию является только int
так что я просто хочу заглянуть в мою программу, поэтому я просто запустить команду как
javap -verbose RunTimeS.class
и положить положить содержит
iload_1
это целое число загружается