我正在尝试将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?
答案 0 :(得分:4)
这是因为Java int下溢并且没有告诉你。
要获得您在pl中寻找的答案,您需要使用bigint。然后检测结果小于Java Integer.MIN_INT(-2 ^ 31)的情况,这是Java将给出肯定结果的情况。要获得Java会给你的东西,添加2 ^ 32。
答案 1 :(得分:2)
int
long
尝试使用{{1}}尝试相同的内容,它应该有效。
答案 2 :(得分:2)
它溢出,因为结果对于int来说太大了。请改用long。
答案 3 :(得分:1)
Java将它们总和为32位有符号整数,它们包含在-2 31 。你尝试过64位长吗?
答案 4 :(得分:1)
Java中int
的有效兰特是-2,147,483,648 to 2,147,483,647
(-2^31 - 2^31-1
)。
您正在导致整数下溢。您应该使用类型long
而不是int,其范围为-2^63 to 2^63-1
答案 5 :(得分:0)
Java将这两个数字视为有符号整数。 基本上,烧结整数的范围是-2,147,483,648到2,147,483,647(-2 ^ 31 - 2 ^ 31-1)。 因此,这些值的总和是-2712963903,它小于最小值-2 ^ 31所以下溢,然后通过做2 ^ 32 - 2712963903包裹,它给你签名的int 1582003393。
答案 6 :(得分:-1)
尝试使用long
,在这种情况下不会溢出(但会有足够大的数字)
System.out.println((long) n1 + n2);