Java总和2负数

时间:2011-02-25 19:25:43

标签: java sum plpgsql negative-number

我正在尝试将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 个答案:

答案 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);