Добавление любого значения к максимальному целочисленному значению дает неправильный расчет

Я добавляю два числа 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 и вычислительными типами виртуальной машины Java как

Отображение между фактическими типами виртуальной машины Java и вычислительными типами виртуальной машины Java

в котором говорится, что короткий тип по умолчанию является только int

так что я просто хочу заглянуть в мою программу, поэтому я просто запустить команду как

javap -verbose RunTimeS.class

и положить положить содержит

iload_1

это целое число загружается

Подробный вывод для класса

Другие вопросы по тегам