Почему я получаю -2, если добавляю к себе 2147483647 в java для типа int и long?

Для целочисленного типа данных 2147483647 число находится в пределах диапазона.

Я попробовал небольшую программу, как показано ниже,

int a = 2147483647;
int b = 2147483647;
int c = a + b;

Когда я печатаю c, он печатается как -2. Я изменил тип c на long и double все тот же результат.

Почему такое поведение?

Я использую java 12.

int + int дает int, и вы присваиваете результат int.
Michał Krzywański 15.05.2019 18:56

Результат сначала вычисляется, а затем сохраняется в c. Поскольку a и b являются целыми числами, результатом также является int, а поскольку целое число переполняется до -2, это значение помещается в c. В другом мире ваш код по сути int c = -2. Каковы шансы для такого кода, когда вы объявляете c как long или double?

Pshemo 15.05.2019 18:56

я назначил длинный все тот же ответ, даже я явно привел тот же ответ -2

Raghu 15.05.2019 18:56

измените a или b на длинный. А также измените c на длинный.

Michał Krzywański 15.05.2019 18:59

@Pshemo, если взять пример с int = byte+byte, все работает хорошо. Почему бы и нет в случае long=int+int ?

Raghu 15.05.2019 19:01

Дайте определение «хорошо работать». Какие значения вы используете с int = byte+byte? Какой результат вы получили?

Pshemo 15.05.2019 19:03

Чтобы понять, почему результат равен -2, вам сначала нужно знать, что типы данных, такие как int, хранятся в виде двоичных чисел в дополнение до двух, а затем узнать, что это такое. Прочитайте статью в Википедии, на которую я только что ссылался, чтобы узнать, что это такое и как это работает.

Andreas 15.05.2019 19:05

@michalk, если все длинные, результат правильный. но почему бы и нет в случае int+int, поскольку значение находится в диапазоне..

Raghu 15.05.2019 19:05

@Raghu По поводу byte+bytestackoverflow.com/questions/18483470/…

Pshemo 15.05.2019 19:06

@Raghu «почему бы и нет в случае int+int, поскольку значение находится в диапазоне» Но значение 2147483647 + 2147483647, которое равно 4294967294, равно нет в диапазоне int, а операция int+int приводит к int, а не long, даже если она назначена long. Преобразование в long происходит после операции сложения.

Andreas 15.05.2019 19:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
10
861
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Замените int a , b , c на long a , b , c . Здесь a и b были целыми, и когда они добавляются, число тоже является целым. Но это выходит за рамки int. Итак, измените их на длинные, чтобы получить правильный ответ.

Два целых числа складываются вместе как целые числа. Результатом является int, который неявно приводится к типу long или double, если c является типом long или double. Чтобы избежать этого, измените типы a и b на длинные, чтобы сложение было длинным сложением.

Ответ принят как подходящий

Обновлено: живая демонстрация

Вот что происходит, когда вы добавляете эти числа:

int a = 2147483647;
int b = 2147483647;

В двоичном формате:

a = 0b01111111111111111111111111111111
b = 0b01111111111111111111111111111111

Сложение этих чисел вместе дает число больше Integer.MAX_VALUE (очевидно):

long c = a + b; // -2

В двоичном формате:

  0b01111111111111111111111111111111
+ 0b01111111111111111111111111111111
------------------------------------
  0b11111111111111111111111111111110

  == -2 when taking into account 2's complement

Затем результат преобразуется в long.

Чтобы числа добавлялись как long, а не int, сделайте a и b обе long.

просто добавление к ответу, java могла бы выполнить приведение типов до тех пор, пока она добавляет, но не сделала этого, потому что она следует правилу целевого типа, например max (int, тип op1, тип op2). В вопросе это max(int, int, int), поэтому во время выполнения java считает, что целевой тип должен быть int..

Raghu 15.05.2019 19:40

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