2

我正在尝试将 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 获得相同的结果?

4

7 回答 7

7

发生这种情况是因为 Java int 下溢并且没有告诉您。

要获得您在 pl 中寻找的答案,您需要使用 bigint。然后检测结果小于 Java Integer.MIN_INT (-2^31) 的情况,这是 Java 会给出肯定结果的情况。要获得 Java 将提供的内容,请添加 2^32。

于 2011-02-25T19:46:16.153 回答
2

你正在int尝试同样的事情,long它应该可以工作。

于 2011-02-25T19:28:04.777 回答
2

它溢出了,因为结果对于 int 来说太大了。改用 long 。

于 2011-02-25T19:28:13.807 回答
1

Java 将它们求和为 32 位有符号整数,在 -2 31处换行。您是否尝试过 64 位长?

于 2011-02-25T19:28:08.140 回答
1

Java 中有效的 randint-2,147,483,648 to 2,147,483,647( -2^31 - 2^31-1)。

您正在导致整数下溢。您应该使用类型long而不是 int 范围从-2^63 to 2^63-1

于 2011-02-25T19:28:24.820 回答
0

Java 将这两个数字视为有符号整数。基本上,单数整数的范围是 -2,147,483,648 到 2,147,483,647 (-2^31 - 2^31-1)。因此,这些值的总和为 -2712963903,它小于最小值 -2^31,因此下溢,然后通过执行 2^32 - 2712963903 进行环绕,从而为您提供带符号的 int 1582003393。

于 2014-10-14T15:38:23.680 回答
-1

尝试使用long在这种情况下不会溢出的 a (但对于足够大的数字)

System.out.println((long) n1 + n2);
于 2011-02-25T22:56:21.707 回答