Java сумма 2 отрицательных чисел - PullRequest
1 голос
/ 25 февраля 2011

Я пытаюсь преобразовать функцию в java в pl / pgsql, и одна проблема, которую я обнаружил, это когда я пытаюсь сложить 2 отрицательных числа и получить положительное число, более конкретно:

public void sum(){
    int n1 = -1808642602;
    int n2 = -904321301;
    System.out.println(n1 + n2);// result is 1582003393
}

И в pl / pgsql я получаю целое число вне диапазона ошибок, и если я изменяю тип переменных на bigint, я получаю нормальную сумму 2 отрицательных чисел, то есть -2712963903 вместо 1582003393

Как мне сделать, чтобы pl / pgsql получил тот же результат, не печатая целое число из-за ошибки диапазона?

Ответы [ 7 ]

4 голосов
/ 25 февраля 2011

Это происходит потому, что Java int теряет значение и не сообщает вам.

Чтобы получить ответ, который вы ищете в pl, вам нужно использовать bigint. Затем определите случай, когда результат меньше, чем Java Integer.MIN_INT (-2 ^ 31), и это тот случай, когда Java даст положительный результат. Чтобы получить то, что даст вам Java, добавьте 2 ^ 32.

2 голосов
/ 25 февраля 2011

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

2 голосов
/ 25 февраля 2011

Вы переполняете int, попробуйте то же самое с long, и оно должно работать.

1 голос
/ 25 февраля 2011

Этот действительный ранд int в Java равен -2,147,483,648 to 2,147,483,647 (-2^31 - 2^31-1).

Вы вызываете переполнение целого числа. Вы должны использовать тип long вместо int, который варьируется от -2^63 to 2^63-1

1 голос
/ 25 февраля 2011

Java суммирует их как 32-битные целые числа со знаком, которые переносятся в -2 31 Вы пробовали вместо этого 64-битную длину?

0 голосов
/ 14 октября 2014

Java рассматривает эти 2 числа как целые числа со знаком.В основном область действия целых чисел от -2 147 483 648 до 2 147 483 647 (-2 ^ 31 - 2 ^ 31-1).Следовательно, сумма этих значений равна -2712963903, что меньше минимума -2 ^ 31, поэтому он теряет значение, а затем оборачивается, выполняя 2 ^ 32 - 2712963903, что дает вам int 1582003393 со знаком.

0 голосов
/ 26 февраля 2011

Попробуйте использовать long, который не будет переполнен в этом случае (но будет достаточно большим числом)

System.out.println((long) n1 + n2);
...