ArithmeticException не генерируется для переполнения в течение 2 ^ 32 - PullRequest
0 голосов
/ 13 мая 2018

Я знаю, что присвоение номера больше 2^32 имеет шанс сгенерировать ArithmeticException, но сегодня, когда я программировал:

int x = 65535
System.out.println(x * x);

Output: -131071

Так что не исключение, а неожиданный результат.

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Я думаю, вы путаете с тем, сколько бит типа int равно 32 битам с числами, которые он представляет, между:

 -2 147 483 648 <= int <= 2 147 483 647

Поскольку он также представляет отрицательные числа и может представлять только 2 ^ 31

0 голосов
/ 13 мая 2018

В Java, int является 32-битным примитивным знаком, который имеет

максимальное значение = 2,147,483,647

и

минимальное значение = -2,147,483,648

Результат вашего умножения - 4,294,836,225.

Так как вы используете тип int примитив, если он overflows, он возвращается к minimum value и продолжается оттуда. Если это underflows, оно возвращается к maximum value и продолжается оттуда.

Если вы хотите поймать исключение, вы можете использовать Math class или Integer class.

        try
        {
          int c = Math.multiplyExact(a,b);
        } catch (ArithmeticException ex)
        {
            System.err.println("int is too small, falling back to long.");;
        }
0 голосов
/ 13 мая 2018

Перелив

Умножение не защищено от переполнений.

Здесь вы видите переполнение целых чисел . Если вы возьмете наибольшее целое число Integer.MAX_VALUE и добавите 1, вы получите наименьшее целое число INTEGER.MIN_VALUE:

int value = Integer.MAX_VALUE;
System.out.println(value);  // 2147483647
value++;
System.out.println(value);  // -2147483648

То же самое происходит здесь, потому что

65_535 * 65_535 = 4_294_836_225 > 2_147_483_647

Диапазон int

В Java int - это 32-разрядное значение со знаком. В частности, это не без знака .

                 |    min-value   |   max-value   |
-----------------|----------------|---------------|
   signed-32-bit |          -2^31 |      2^31 - 1 |
                 | -2_147_483_648 | 2_147_483_647 |
-----------------|----------------|---------------|
 unsigned-32-bit |        2^0 - 1 |      2^32 - 1 |
                 |              0 | 4_294_967_295 |

Исключение

Умножение не бросает ArithmeticException. Насколько мне известно, это происходит только в том случае, если вы делите на 0, так как это не должно быть возможно по определению. Также см. документацию об исключении.

Для защищенного умножения рассмотрите возможность использования Math#multiplyExact ( документация ).

...