Для целочисленного типа данных 2147483647 число находится в пределах диапазона.
Я попробовал небольшую программу, как показано ниже,
int a = 2147483647;
int b = 2147483647;
int c = a + b;
Когда я печатаю c, он печатается как -2. Я изменил тип c на long и double все тот же результат.
Почему такое поведение?
Я использую java 12.
Результат сначала вычисляется, а затем сохраняется в c. Поскольку a и b являются целыми числами, результатом также является int, а поскольку целое число переполняется до -2, это значение помещается в c. В другом мире ваш код по сути int c = -2. Каковы шансы для такого кода, когда вы объявляете c как long или double?
я назначил длинный все тот же ответ, даже я явно привел тот же ответ -2
измените a или b на длинный. А также измените c на длинный.
@Pshemo, если взять пример с int = byte+byte, все работает хорошо. Почему бы и нет в случае long=int+int ?
Дайте определение «хорошо работать». Какие значения вы используете с int = byte+byte? Какой результат вы получили?
Чтобы понять, почему результат равен -2, вам сначала нужно знать, что типы данных, такие как int, хранятся в виде двоичных чисел в дополнение до двух, а затем узнать, что это такое. Прочитайте статью в Википедии, на которую я только что ссылался, чтобы узнать, что это такое и как это работает.
@michalk, если все длинные, результат правильный. но почему бы и нет в случае int+int, поскольку значение находится в диапазоне..
@Raghu По поводу byte+bytestackoverflow.com/questions/18483470/…
@Raghu «почему бы и нет в случае int+int, поскольку значение находится в диапазоне» Но значение 2147483647 + 2147483647, которое равно 4294967294, равно нет в диапазоне int, а операция int+int приводит к int, а не long, даже если она назначена long. Преобразование в long происходит после операции сложения.




Замените 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..
int+intдаетint, и вы присваиваете результат int.