Java-арифметика - PullRequest
       36

Java-арифметика

3 голосов
/ 09 октября 2010

почему этот код возвращает неправильное значение?

int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);

Ответы [ 4 ]

9 голосов
/ 09 октября 2010

Когда вы добавляете 1 к Integer.MAX_VALUE, оно переполняется и превращается в Integer.MIN_VALUE.

Это происходит потому, что Java использует дополнение к двум для представления целых чисел. Пример в 4 бита:

0000 : 0
0001 : 1
...
0111 : 7 (max value)
1000 : -8 (min value)
...
1110 : -2
1111 : -1

Таким образом, когда вы добавляете 1 к 0111 (макс.), Вы переходите к 1000, и это минимум. Расширьте эту идею до 32-битной, и она работает так же.


Что касается того, почему ваш long также показывает неверный результат, это потому, что он выполняет сложение int s и , а затем неявно преобразует в long. Вам нужно сделать:

long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value
3 голосов
/ 09 октября 2010

Как следует из названия, Integer.MAX_VALUE - это максимальное значение, доступное для Integer.В Java, когда целое число превышает максимальное значение на 1 (или переполняется на 1), его значение будет Integer.MIN_VALUE.

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

Осторожно, с Float или Double у вас не будет этого переполнения,значение будет POSITIVE_INFINITY

Операция с переполнением создает бесконечность со знаком, операция с понижением - денормализованное значение или нулевой знак, а операция без математически определенного результата - NaN.


Ресурсы:

2 голосов
/ 09 октября 2010

Вы переполняете 32-битный целочисленный тип здесь, пытаясь сохранить значение, которое не может быть представлено этим типом (2 ^ 31 - 1):

int i = Integer.MAX_VALUE + 1;
0 голосов
/ 09 октября 2010

Целочисленное значение Java - это 32-битные диапазоны со знаком: от -2 147 483 648 до 2 147 483 647.

Невозможно задать целую переменную i, как в i=Integer.MAX_VALUE+1;

...